Android menggunakan OpenGL ES (GLES) API untuk merender grafis. Untuk membuat konteks GLES dan menyediakan sistem windowing 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, 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 permukaan. Permukaan adalah sisi produsen
BufferQueue. Konsumen, yaitu SurfaceView, SurfaceTexture, TextureView, atau ImageReader, membuat permukaan.
Saat Anda memanggil eglCreateWindowSurface()
, EGL akan membuat objek
EGLSurface baru dan menghubungkannya ke antarmuka produsen BufferQueue objek
jendela. Mulai saat itu, merender ke EGLSurface tersebut akan mengeluarkan buffer dari antrean, merender ke dalamnya, dan mengantrekannya untuk digunakan oleh konsumen.
EGL tidak menyediakan panggilan kunci/buka kunci. Keluarkan perintah menggambar dan
lalu panggil eglSwapBuffers()
untuk mengirimkan frame saat ini. Nama
metode berasal dari pertukaran tradisional buffer depan dan belakang, tetapi penerapan
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, EGLSurface akan terputus dari BufferQueue dan memungkinkan sesuatu yang lain terhubung.
Thread tertentu dapat beralih di antara beberapa EGLSurface dengan mengubah apa yang saat ini. EGLSurface hanya boleh aktif di satu thread dalam satu waktu.
EGL bukan aspek lain dari platform, seperti SurfaceHolder. EGLSurface adalah konsep terkait, tetapi independen. Anda dapat menggambar di EGLSurface yang tidak didukung oleh platform, dan Anda dapat menggunakan platform tanpa EGL. EGLSurface menyediakan tempat untuk menggambar GLES.
Lihat Compatibility Definition Document Android untuk persyaratan OpenGL ES dan EGL.
ANativeWindow
Class permukaan publik diimplementasikan dalam bahasa pemrograman Java. Yang setara di C/C++ adalah class ANativeWindow, yang diekspos sebagian oleh Android NDK. Anda
dapat mengambil ANativeWindow dari permukaan dengan panggilan ANativeWindow_fromSurface()
. Sama seperti sepupunya yang menggunakan bahasa Java, Anda dapat menguncinya, merendernya di software, dan membukanya serta mempostingnya. Jenis jendela native dasar adalah sisi produsen dari
BufferQueue.
Untuk membuat platform jendela EGL dari kode native, teruskan instance
EGLNativeWindowType ke eglCreateWindowSurface()
. EGLNativeWindowType adalah
sinonim untuk ANativeWindow, sehingga Anda dapat melakukan transmisi dari satu ke yang lain.