EGLSurfaces und OpenGL ES

Android verwendet die OpenGL ES (GLES) API zum Rendern von Grafiken. Um GLES-Kontexte zu erstellen und ein Fenstersystem für GLES-Renderings bereitzustellen, verwendet Android die EGL-Bibliothek . GLES-Aufrufe rendern texturierte Polygone, während EGL-Aufrufe Renderings auf Bildschirmen darstellen.

Bevor Sie mit GLES zeichnen, müssen Sie einen GL-Kontext erstellen. In EGL bedeutet dies, dass ein EGLContext und ein EGLSurface erstellt werden. GLES-Vorgänge gelten für den aktuellen Kontext, auf den über den Thread-lokalen Speicher zugegriffen wird und nicht als Argument übergeben wird. Der Rendering-Code sollte in einem aktuellen GLES-Thread ausgeführt werden, nicht im UI-Thread.

EGLSurfaces

Bei der EGLSurface kann es sich um einen von EGL zugewiesenen Off-Screen-Puffer namens pbuffer oder um ein vom Betriebssystem zugewiesenes Fenster handeln. Durch Aufrufen der Funktion eglCreateWindowSurface() werden EGL-Fensteroberflächen erstellt. eglCreateWindowSurface() verwendet ein Fensterobjekt als Argument, bei dem es sich bei Android um eine Oberfläche handelt. Eine Oberfläche ist die Produzentenseite einer BufferQueue. Verbraucher , die SurfaceView, SurfaceTexture, TextureView oder ImageReader sind, erstellen Oberflächen. Wenn Sie eglCreateWindowSurface() aufrufen, erstellt EGL ein neues EGLSurface-Objekt und verbindet es mit der Producer-Schnittstelle der BufferQueue des Fensterobjekts. Ab diesem Zeitpunkt führt das Rendern auf dieser EGLSurface dazu, dass ein Puffer aus der Warteschlange entfernt, in ihn gerendert und zur Verwendung durch den Verbraucher in die Warteschlange gestellt wird.

EGL stellt keine Sperr-/Entsperraufrufe bereit. Geben Sie Zeichenbefehle aus und rufen Sie dann eglSwapBuffers() auf, um den aktuellen Frame zu übermitteln. Der Methodenname stammt vom traditionellen Austausch von Vorder- und Hinterpuffern, die tatsächliche Implementierung kann jedoch unterschiedlich sein.

Einer Oberfläche kann jeweils nur ein EGLSurface zugeordnet sein (es kann nur ein Produzent mit einer BufferQueue verbunden sein), aber wenn Sie das EGLSurface zerstören, wird es von der BufferQueue getrennt und lässt etwas anderes eine Verbindung herstellen.

Ein bestimmter Thread kann zwischen mehreren EGLSurfaces wechseln, indem er ändert, was aktuell ist. Ein EGLSurface darf jeweils nur in einem Thread aktuell sein.

EGL ist kein weiterer Aspekt einer Oberfläche (wie SurfaceHolder). EGLSurface ist ein verwandtes, aber unabhängiges Konzept. Sie können auf einer EGLSurface zeichnen, die nicht durch eine Oberfläche unterstützt wird, und Sie können eine Oberfläche ohne EGL verwenden. EGLSurface bietet GLES lediglich einen Ort zum Zeichnen.

Informationen zu OpenGL ES- und EGL-Anforderungen finden Sie im Android Compatibility Definition Document .

ANativeWindow

Die öffentliche Oberflächenklasse ist in der Programmiersprache Java implementiert. Das Äquivalent in C/C++ ist die ANativeWindow-Klasse, die vom Android NDK halb verfügbar gemacht wird. Sie können das ANativeWindow von einer Oberfläche mit dem Aufruf ANativeWindow_fromSurface() abrufen. Genau wie sein Cousin in der Java-Sprache können Sie es sperren, in Software rendern und entsperren und veröffentlichen. Der grundlegende native Fenstertyp ist die Produzentenseite einer BufferQueue.

Um eine EGL-Fensteroberfläche aus nativem Code zu erstellen, übergeben Sie eine Instanz von EGLNativeWindowType an eglCreateWindowSurface() . EGLNativeWindowType ist ein Synonym für ANativeWindow, sodass Sie das eine in das andere umwandeln können.