Android, grafikleri işlemek için OpenGL ES (GLES) API kullanır. Android, GLES bağlamları oluşturmak ve GLES işlemeleri için bir pencereleme sistemi sağlamak için EGL kitaplığını kullanır. GLES çağrıları dokulu poligonlar oluştururken EGL çağrıları ekranlara render 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, bağımsız değişken olarak iletilmek yerine evre-yerel depolama yoluyla erişilen geçerli bağlama uygulanır. Oluşturma kodu, UI iş parçacığında değil, geçerli bir GLES iş parçacığında yürütülmelidir.
EGL Yüzeyler
EGLSurface, EGL tarafından ayrılan, pbuffer olarak adlandırılan ekran dışı bir tampon 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. Bir 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 bunu pencere nesnesinin BufferQueue'nun üretici arayüzüne bağlar. Bu noktadan itibaren, bu EGLSurface'e işleme, bir arabelleğin kuyruğunun açılması, dönüştürülmesi ve tüketici tarafından kullanılmak üzere sıraya alınmasıyla sonuçlanır.
EGL çağrıları kilitleme / kilidi açma sağlamaz. Çizim komutlarını verin ve ardından geçerli çerçeveyi göndermek için
eglSwapBuffers() çağırın. Yöntem adı, geleneksel ön ve arka tamponların değiştirilmesinden gelir, ancak gerçek uygulama farklı olabilir.
Aynı anda yalnızca bir EGLSurface bir yüzeyle ilişkilendirilebilir (bir BufferQueue'ya bağlı yalnızca bir üretici olabilir), ancak EGLSurface'i yok ederseniz BufferQueue ile bağlantısı kesilir ve başka bir şeyin bağlanmasına izin verir.
Belirli bir iş parçacığı, geçerli olanı değiştirerek birden çok EGLSurfaces arasında geçiş yapabilir. Bir EGLSurface, aynı anda yalnızca bir iş parçacığı üzerinde geçerli olmalıdır.
EGL, bir yüzeyin başka bir yönü değildir (SurfaceHolder gibi). EGLSurface ilişkili ancak bağımsız bir kavramdır. Bir yüzey tarafından desteklenmeyen bir EGLSurface üzerinde çizim yapabilir ve EGL'siz bir yüzey kullanabilirsiniz. EGLSurface, sadece GLES'e ç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 ++ eşdeğeri, Android NDK tarafından yarı açık olan 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çıp yayınlayabilirsiniz. Temel yerel pencere türü, 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 çevirebilirsiniz.