Android, grafikleri oluşturmak için OpenGL ES (GLES) API'sini kullanır. GLES bağlamları oluşturmak ve GLES işlemeleri için bir pencereleme sistemi sağlamak için Android, EGL kitaplığını kullanır. GLES çağrıları dokulu çokgenler oluştururken, EGL çağrıları ekranlara işleme koyar.
GLES ile çizim yapmadan önce bir GL bağlamı oluşturmanız gerekir. EGL'de bu, bir EGLContext ve bir EGLsurface oluşturmak anlamına gelir. GLES işlemleri, argüman olarak iletilmek yerine iş parçacığı yerel depolama yoluyla erişilen mevcut bağlam için geçerlidir. İşleme kodu, UI iş parçacığında değil, geçerli bir GLES iş parçacığında yürütülmelidir.
EGLSYüzeyler
EGLSurface , pbuffer adı verilen EGL tarafından tahsis edilen bir ekran dışı arabellek veya işletim sistemi tarafından tahsis edilen bir pencere olabilir. eglCreateWindowSurface()
işlevinin çağrılması, EGL pencere yüzeyleri oluşturur. eglCreateWindowSurface()
, Android'de bir yüzey olan bir pencere nesnesini argüman olarak alır. Yüzey, BufferQueue'nun üretici tarafıdır. SurfaceView , SurfaceTexture, TextureView veya ImageReader olan tüketiciler yüzeyler oluşturur. eglCreateWindowSurface()
çağırdığınızda, EGL yeni bir EGLSurface nesnesi oluşturur ve onu pencere nesnesinin BufferQueue'sinin üretici arayüzüne bağlar. Bu noktadan itibaren, o EGLSurface'e işleme, bir arabelleğin kuyruğa alınması, işlenmesi ve tüketici tarafından kullanılmak üzere kuyruğa alınmasıyla sonuçlanır.
EGL, aramaları kilitleme/kilit açma özelliği sağlamaz. Çizim komutlarını verin ve ardından mevcut çerçeveyi göndermek için eglSwapBuffers()
'ı arayın. Yöntem adı, ön ve arka arabelleklerin geleneksel takasından gelir, ancak gerçek uygulama farklı olabilir.
Bir seferde yalnızca bir EGLSurface bir yüzeyle ilişkilendirilebilir (bir BufferQueue'ya bağlı yalnızca bir üreticiniz olabilir), ancak EGLSurface'i yok ederseniz, BufferQueue ile bağlantısını keser ve başka bir şeyin bağlanmasına izin verir.
Belirli bir iş parçacığı, geçerli olanı değiştirerek birden çok EGLSurface arasında geçiş yapabilir. Bir EGLSurface aynı anda yalnızca bir iş parçacığında geçerli olmalıdır.
EGL, bir yüzeyin başka bir yönü değildir (SurfaceHolder gibi). EGLSurface ilgili ancak bağımsız bir kavramdır. Bir yüzey tarafından desteklenmeyen bir EGLsurface üzerine çizim yapabilir ve EGL'siz bir yüzey kullanabilirsiniz. EGLSurface, GLES'e sadece çizilecek bir yer sağlar.
OpenGL ES ve EGL gereksinimleri için Android Uyumluluk Tanımı Belgesine bakın.
ANativeWindow
Genel yüzey sınıfı, Java programlama dilinde uygulanır. C/C++'daki eşdeğeri, Android NDK tarafından yarı açığa çıkarılan ANativeWindow sınıfıdır. ANativeWindow'u, ANativeWindow_fromSurface()
çağrısıyla bir yüzeyden alabilirsiniz. Java dilindeki kuzeni gibi, onu kilitleyebilir, yazılımda oluşturabilir ve kilidini açabilir ve yayınlayabilirsiniz. Temel yerel pencere türü, bir BufferQueue'nun üretici tarafıdır.
Yerel koddan bir EGL pencere yüzeyi oluşturmak için, EGLNativeWindowType örneğini eglCreateWindowSurface()
. EGLNativeWindowType, ANativeWindow ile eşanlamlıdır, böylece birini diğerine aktarabilirsiniz.