Android, grafikleri oluşturmak için OpenGL ES (GLES) API'sini kullanır. Android, GLES bağlamları oluşturmak ve GLES işlemeleri için bir pencereleme sistemi sağlamak amacıyla EGL kitaplığını kullanır. GLES çağrıları dokulu çokgenler oluştururken, EGL çağrıları ekranlara görüntüler 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 yerel iş parçacığı depolama yoluyla erişilen mevcut bağlama uygulanır. Oluşturma kodu, kullanıcı arayüzü iş parçacığında değil, geçerli bir GLES iş parçacığında yürütülmelidir.
EGLYüzeyler
EGLSurface, EGL tarafından tahsis edilen, pbuffer adı verilen ekran dışı bir arabellek veya işletim sistemi tarafından tahsis edilen bir pencere olabilir. eglCreateWindowSurface()
işlevinin çağrılması EGL pencere yüzeylerini oluşturur. eglCreateWindowSurface()
argüman olarak bir pencere nesnesini alır; Android'de bu bir yüzeydir. Yüzey, BufferQueue'nun üretici tarafıdır. SurfaceView, SurfaceTexture, TextureView veya ImageReader olan tüketiciler yüzeyler oluşturur. eglCreateWindowSurface()
öğesini çağırdığınızda, EGL yeni bir EGLSurface nesnesi oluşturur ve onu pencere nesnesinin BufferQueue'sunun üretici arayüzüne bağlar. Bu noktadan itibaren, söz konusu EGLSurface'e yapılan renderleme, bir tamponun sıradan çıkarılması, render edilmesi ve tüketici tarafından kullanılmak üzere kuyruğa alınmasıyla sonuçlanır.
EGL, çağrıları kilitleme/kilit açma özelliğini sağlamaz. Çizim komutlarını verin ve ardından mevcut çerçeveyi göndermek için eglSwapBuffers()
ı çağırın. Yöntemin adı geleneksel ön ve arka arabelleklerin değiştirilmesinden gelir, ancak gerçek uygulama farklı olabilir.
Bir seferde yalnızca bir EGLSurface bir yüzeyle ilişkilendirilebilir (BufferQueue'ya yalnızca bir üretici bağlanabilir), ancak EGLSurface'i yok ederseniz BufferQueue ile olan bağlantısı kesilir ve başka bir şeyin bağlanmasına izin verilir.
Belirli bir iş parçacığı, geçerli olanı değiştirerek birden fazla EGLSurfaces arasında geçiş yapabilir. Bir EGLSurface aynı anda yalnızca bir iş parçacığında güncel olmalıdır.
EGL bir yüzeyin başka bir yönü değildir (SurfaceHolder gibi). EGLSurface ilgili fakat bağımsız bir kavramdır. Bir yüzey tarafından desteklenmeyen bir EGLSurface üzerine çizim yapabilirsiniz ve EGL'siz bir yüzey kullanabilirsiniz. EGLSurface, GLES'e çizim yapacak bir yer sağlıyor.
OpenGL ES ve EGL gereksinimleri için Android Uyumluluk Tanımı Belgesine bakın.
ANatifPencere
Genel yüzey sınıfı Java programlama dilinde uygulanır. C/C++'daki eşdeğeri, Android NDK tarafından yarı açık olarak sunulan ANativeWindow sınıfıdır. ANativeWindow'u ANativeWindow_fromSurface()
çağrısıyla bir yüzeyden alabilirsiniz. Tıpkı Java dilindeki kuzeni gibi onu da kilitleyebilir, yazılımda görüntüleyebilir 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()
öğesine iletin. EGLNativeWindowType, ANativeWindow'un eşanlamlısıdır, böylece birini diğerine aktarabilirsiniz.