Android, grafikleri oluşturmak için OpenGL ES (GLES) API'sini kullanır. Android, GLES bağlamları oluşturmak ve GLES oluşturmaları için bir pencere sistemi sağlamak üzere EGL kitaplığını kullanır. GLES çağrıları, dokulu poligonları oluştururken EGL çağrıları, oluşturulan öğeleri ekranlara yerleştirir.
GLES ile çizim yapmadan önce bir GL bağlamı oluşturmanız gerekir. EGL'de bu, EGLContext ve EGLSurface oluşturmak anlamına gelir. GLES işlemleri, bağımsız değişken olarak iletilmek yerine iş parçacığına özel depolama alanı aracılığıyla erişilen mevcut bağlam için geçerlidir. Oluşturma kodu, kullanıcı arayüzü iş parçacığında değil, GLES iş parçacığında yürütülmelidir.
EGLSurfaces
EGLSurface, EGL tarafından ayrılan ve pbuffer olarak adlandırılan ekran dışı bir arabellek veya işletim sistemi tarafından ayrılan bir pencere olabilir. eglCreateWindowSurface()
işlevini çağırmak EGL pencere yüzeyleri oluşturur.
eglCreateWindowSurface()
, bağımsız değişken olarak bir pencere nesnesi alır. Bu nesne, Android'de bir yüzeydir. Yüzey, BufferQueue'nun üretici tarafıdır. Tüketiciler (SurfaceView, SurfaceTexture, TextureView veya ImageReader) yüzey oluşturur.
eglCreateWindowSurface()
işlevini çağırdığınızda EGL yeni bir EGLSurface nesnesi oluşturur ve bunu pencere nesnesinin BufferQueue'sunun üretici arayüzüne bağlar. Bu noktadan itibaren, EGLSurface'e oluşturma işlemi bir arabelleği sıraya alır, arabelleğe oluşturur ve tüketici tarafından kullanılmak üzere sıraya koyar.
EGL, kilitleme/kilidi açma çağrıları sağlamaz. Çizim komutları verin ve ardından geçerli kareyi göndermek için eglSwapBuffers()
işlevini çağırın. Yöntem adı, ön ve arka arabelleklerin geleneksel olarak yer değiştirmesinden gelir ancak gerçek uygulama farklı olabilir.
Bir yüzeyle aynı anda yalnızca bir EGLSurface ilişkilendirilebilir (BufferQueue'ya yalnızca bir üretici bağlanabilir). Ancak EGLSurface'i yok ederseniz BufferQueue ile 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 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 (ör. SurfaceHolder) başka bir yönü değildir. EGLSurface, ilgili ancak bağımsız bir kavramdır. Yüzeyle desteklenmeyen bir EGLSurface üzerinde çizim yapabilir ve EGL olmadan yüzey kullanabilirsiniz. EGLSurface, GLES'e çizim yapabileceği bir yer sağlar.
OpenGL ES ve EGL koşulları için Android Uyumluluk Tanımı Belgesi'ne bakın.
ANativeWindow
Herkese açık yüzey sınıfı, Java programlama dilinde uygulanır. C/C++'taki karşılığı, Android NDK tarafından yarı açık hâle getirilen ANativeWindow sınıfıdır. ANativeWindow_fromSurface()
çağrısıyla bir yüzeyden ANativeWindow'u alabilirsiniz. Java dilindeki benzerinde olduğu gibi, bunu 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 EGL pencere yüzeyi oluşturmak için eglCreateWindowSurface()
işlevine EGLNativeWindowType örneği iletin. EGLNativeWindowType, ANativeWindow için eş anlamlıdır. Bu nedenle, birini diğerine yayınlayabilirsiniz.