EGLSurfaces dan OpenGL ES

Android menggunakan API OpenGL ES (GLES) untuk merender grafis. Untuk membuat konteks GLES dan menyediakan sistem jendela untuk rendering GLES, Android menggunakan library EGL. Panggilan GLES merender poligon bertekstur, sedangkan panggilan EGL menempatkan rendering di layar.

Sebelum menggambar dengan GLES, Anda harus membuat konteks GL. Di EGL, ini berarti membuat EGLContext dan EGLSurface. Operasi GLES berlaku untuk konteks saat ini, yang diakses melalui penyimpanan lokal thread, bukan diteruskan sebagai argumen. Kode rendering harus dieksekusi di thread GLES saat ini, bukan thread UI.

EGLSurfaces

EGLSurface dapat berupa buffer di luar layar yang dialokasikan oleh EGL, yang disebut pbuffer, atau jendela yang dialokasikan oleh sistem operasi. Memanggil fungsi eglCreateWindowSurface() akan membuat platform jendela EGL. eglCreateWindowSurface() menggunakan objek jendela sebagai argumen, yang di Android adalah platform. Platform adalah sisi produsen BufferQueue. Konsumen, yang merupakan SurfaceView, SurfaceTexture, TextureView, atau ImageReader, membuat platform. Saat Anda memanggil eglCreateWindowSurface(), EGL akan membuat objek EGLSurface baru dan menghubungkannya ke antarmuka produsen BufferQueue objek jendela. Dari titik tersebut dan seterusnya, rendering ke EGLSurface tersebut akan menyebabkan buffer dikeluarkan dari antrean, dirender, dan dimasukkan ke dalam antrean untuk digunakan oleh konsumen.

EGL tidak menyediakan panggilan kunci/buka kunci. Berikan perintah gambar, lalu panggil eglSwapBuffers() untuk mengirimkan frame saat ini. Nama metode berasal dari pertukaran tradisional buffering depan dan belakang, tetapi penerapan yang sebenarnya mungkin berbeda.

Hanya satu EGLSurface yang dapat dikaitkan dengan platform dalam satu waktu (Anda hanya dapat memiliki satu produsen yang terhubung ke BufferQueue), tetapi jika Anda menghancurkan EGLSurface, koneksi akan terputus dari BufferQueue dan memungkinkan hal lain terhubung.

Thread tertentu dapat beralih di antara beberapa EGLSurface dengan mengubah yang saat ini. EGLSurface hanya boleh ada di satu thread dalam satu waktu.

EGL bukan aspek lain dari platform (seperti SurfaceHolder). EGLSurface adalah konsep yang terkait, tetapi independen. Anda dapat menggambar pada EGLSurface yang tidak didukung oleh platform, dan Anda dapat menggunakan platform tanpa EGL. EGLSurface hanya memberikan tempat untuk menggambar ke GLES.

Lihat Dokumen Definisi Kompatibilitas Android untuk persyaratan OpenGL ES dan EGL.

ANativeWindow

Class platform publik diimplementasikan dalam bahasa pemrograman Java. Yang setara dalam C/C++ adalah class ANativeWindow, yang semi-diekspos oleh Android NDK. Anda dapat mendapatkan ANativeWindow dari platform dengan panggilan ANativeWindow_fromSurface(). Sama seperti sepupunya dalam bahasa Java, Anda dapat menguncinya, merender dalam software, dan membuka kunci serta mempostingnya. Jenis jendela native dasar adalah sisi produsen BufferQueue.

Untuk membuat platform jendela EGL dari kode native, teruskan instance EGLNativeWindowType ke eglCreateWindowSurface(). EGLNativeWindowType adalah sinonim untuk ANativeWindow, sehingga Anda dapat mentransmisikan satu ke yang lain.