EGLSurfaces ve OpenGL ES

Android, grafikleri oluşturmak için OpenGL ES (GLES) API'sini kullanır. Android, GLES bağlamları oluşturmak ve GLES oluşturma işlemleri için bir pencere sistemi sağlamak amacıyla EGL kitaplığını kullanır. GLES çağrıları dokulu poligonları oluştururken EGL çağrıları oluşturma işlemlerini ekranlara yerleştirir.

GLES ile çizim yapmadan önce bir GL bağlamı oluşturmanız gerekir. EGL'de bu, bir EGLContext ve EGLSurface oluşturmak anlamına gelir. GLES işlemleri, bağımsız değişken olarak iletilen yerine iş parçacığı yerel depolama alanı üzerinden erişilen geçerli bağlam için geçerlidir. Oluşturma kodu, kullanıcı arayüzü iş parçacığında değil, mevcut bir 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şlevi çağrıldığında EGL pencere yüzeyleri oluşturulur. eglCreateWindowSurface(), Android'de bir yüzey olan pencere nesnesi bağımsız değişkeni alır. Yüzey, bir BufferQueue'ın üretici tarafıdır. SurfaceView, SurfaceTexture, TextureView veya ImageReader olan tüketiciler yüzey oluşturur. eglCreateWindowSurface() işlevini çağırdığınızda EGL yeni bir EGLSurface nesnesi oluşturur ve bu nesneyi pencere nesnesinin BufferQueue üretici arayüzüne bağlar. Bu noktadan itibaren, söz konusu EGLSurface'te oluşturma işlemi, bir arabelleğin sıra dışı bırakılmasına, oluşturulmasına ve tüketici tarafından kullanılmak üzere sıraya eklenmesine neden olur.

EGL, kilitleme/kilit açma çağrıları sağlamaz. Çizim komutları verin ve ardından mevcut kareyi göndermek için eglSwapBuffers() işlevini çağırın. Yöntem adı, ön ve arka arabelleklerin geleneksel takas işleminden gelir ancak gerçek uygulama farklı olabilir.

Bir yüzeyle aynı anda yalnızca bir EGLSurface ilişkilendirilebilir (BufferQueue'a yalnızca bir üretici bağlayabilirsiniz). Ancak EGLSurface'i yok ederseniz BufferQueue'dan bağlantısı kesilir ve başka bir öğenin bağlanmasına izin verilir.

Belirli bir iş parçacığı, mevcut olanı değiştirerek birden fazla EGLSurface arasında geçiş yapabilir. 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üzeyle desteklenmeyen bir EGLSurface'te çizim yapabilir ve EGL olmadan bir yüzey kullanabilirsiniz. EGLSurface, GLES'e yalnızca çizim alanı 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++'daki eşdeğeri, Android NDK tarafından yarı açık olarak sunulan ANativeWindow sınıfıdır. ANativeWindow_fromSurface() çağrısını kullanarak ANativeWindow'u bir yüzeyden alabilirsiniz. Java dilinde yazılmış kuzeninde olduğu gibi, bu dosyayı kilitleyebilir, yazılımda oluşturabilir, kilidini açıp yayınlayabilirsiniz. Temel yerel pencere türü, bir BufferQueue'ın üretici tarafıdır.

Yerel koddan EGL pencere yüzeyi oluşturmak için eglCreateWindowSurface() parametresine EGLNativeWindowType örneği gönderin. EGLNativeWindowType, ANativeWindow ile eş anlamlıdır. Bu nedenle, birini diğerine yayınlayabilirsiniz.