EGLSurfaces dan OpenGL ES

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

Sebelum menggambar dengan GLES, Anda perlu membuat konteks GL. Di EGL, ini berarti membuat EGLContext dan EGLSurface. Operasi GLES berlaku untuk konteks saat ini, yang diakses melalui penyimpanan lokal-utas alih-alih diteruskan sebagai argumen. Kode rendering harus dijalankan pada utas GLES saat ini, bukan utas UI.

EGLSpermukaan

EGLSurface dapat berupa buffer di luar layar yang dialokasikan oleh EGL, yang disebut pbuffer , atau jendela yang dialokasikan oleh sistem operasi. Memanggil fungsi eglCreateWindowSurface() membuat permukaan jendela EGL. eglCreateWindowSurface() mengambil objek jendela sebagai argumen, yang pada Android adalah permukaan. Permukaan adalah sisi produsen dari BufferQueue. Konsumen , yaitu SurfaceView, SurfaceTexture, TextureView, atau ImageReader, membuat permukaan. Saat Anda memanggil eglCreateWindowSurface() , EGL membuat objek EGLSurface baru dan menghubungkannya ke antarmuka produser BufferQueue objek jendela. Sejak saat itu, rendering ke EGLSurface itu menghasilkan buffer yang di-dequeued, dirender ke, dan diantrekan untuk digunakan oleh konsumen.

EGL tidak menyediakan panggilan kunci/buka kunci. Keluarkan perintah menggambar dan kemudian panggil eglSwapBuffers() untuk mengirimkan bingkai saat ini. Nama metode berasal dari pertukaran tradisional buffer depan dan belakang, tetapi implementasi sebenarnya mungkin berbeda.

Hanya satu EGLSurface yang dapat diasosiasikan dengan permukaan pada satu waktu (Anda hanya dapat memiliki satu produser yang terhubung ke BufferQueue), tetapi jika Anda menghancurkan EGLSurface, EGLSurface terputus dari BufferQueue dan memungkinkan sesuatu yang lain terhubung.

Utas tertentu dapat beralih di antara beberapa EGLSurfaces dengan mengubah apa yang ada saat ini . EGLSurface harus aktif hanya pada satu utas pada satu waktu.

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

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

ANativeWindow

Kelas permukaan publik diimplementasikan dalam bahasa pemrograman Java. Setara dalam C/C++ adalah kelas ANativeWindow, semi-terpapar oleh Android NDK . Anda bisa mendapatkan ANativeWindow dari permukaan dengan panggilan ANativeWindow_fromSurface() . Sama seperti sepupunya yang berbahasa Java, Anda dapat menguncinya, merender dalam perangkat lunak, dan membuka kunci dan memposting. Jenis jendela asli dasar adalah sisi produsen dari BufferQueue.

Untuk membuat permukaan jendela EGL dari kode asli, berikan instance EGLNativeWindowType ke eglCreateWindowSurface() . EGLNativeWindowType adalah sinonim untuk ANativeWindow, jadi Anda dapat melemparkan satu ke yang lain.