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 perpustakaan EGL . Panggilan GLES menampilkan poligon bertekstur, sedangkan panggilan EGL menampilkan rendering di layar.

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

Permukaan EGL

EGLSurface dapat berupa buffer di luar layar yang dialokasikan oleh EGL, disebut pbuffer , atau jendela yang dialokasikan oleh sistem operasi. Memanggil fungsi eglCreateWindowSurface() akan membuat permukaan jendela EGL. eglCreateWindowSurface() menggunakan objek window sebagai argumen, yang pada Android merupakan 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 tersebut akan mengakibatkan buffer dikeluarkan dari antrean, dirender ke dalam, dan diantrekan untuk digunakan oleh konsumen.

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

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

Thread tertentu dapat beralih di antara beberapa EGLSurfaces dengan mengubah apa yang ada saat ini . EGLSurface harus terkini hanya pada satu thread pada satu waktu.

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

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

Jendela Asli

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

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