Unter Android wird die OpenGL ES (GLES)-API zum Rendern von Grafiken verwendet. Zum Erstellen von GLES-Kontexten und zum Bereitstellen eines Fenstersystems für GLES-Renderings verwendet Android die EGL-Bibliothek. Mit GLES-Aufrufen werden strukturierte Polygone gerendert, während mit EGL-Aufrufen Renderings auf Bildschirmen platziert werden.
Bevor Sie mit GLES zeichnen können, müssen Sie einen GL-Kontext erstellen. In EGL bedeutet das, einen EGLContext und eine EGLSurface zu erstellen. GLES-Vorgänge werden auf den aktuellen Kontext angewendet, auf den über den threadlokalen Speicher zugegriffen wird, anstatt ihn als Argument zu übergeben. Rendering-Code muss in einem GLES-Thread und nicht im UI-Thread ausgeführt werden.
EGLSurfaces
Die EGLSurface kann ein von EGL zugewiesener Off-Screen-Puffer, ein sogenannter Puffer, oder ein vom Betriebssystem zugewiesenes Fenster sein. Durch den Aufruf der Funktion eglCreateWindowSurface()
werden EGL-Fensterflächen erstellt.
eglCreateWindowSurface()
verwendet ein Fensterobjekt als Argument, das auf Android eine Oberfläche ist. Eine Oberfläche ist die Producer-Seite einer BufferQueue. Consumer (SurfaceView, SurfaceTexture, TextureView oder ImageReader) 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 wird beim Rendern auf dieser EGLSurface ein Puffer aus der Warteschlange entfernt, in ihn gerendert und er wird für die Verwendung durch den Consumer in die Warteschlange gestellt.
EGL bietet keine Sperr-/Entsperrungsaufrufe. Geben Sie Zeichenbefehle aus und rufen Sie dann eglSwapBuffers()
auf, um den aktuellen Frame zu senden. Der Methodenname stammt vom traditionellen Tausch von Front- und Back-Buffern, die tatsächliche Implementierung kann jedoch abweichen.
Es kann jeweils nur eine EGLSurface mit einer Oberfläche verknüpft sein (es kann nur ein Producer mit einer BufferQueue verbunden sein). Wenn Sie die EGLSurface jedoch zerstören, wird die Verbindung zur BufferQueue getrennt und es kann eine andere Verbindung hergestellt werden.
Ein Thread kann zwischen mehreren EGLSurfaces wechseln, indem er ändert, was aktuell ist. Eine EGLSurface darf jeweils nur in einem Thread aktuell sein.
EGL ist kein weiterer Aspekt einer Oberfläche, z. B. eines SurfaceHolders. EGLSurface ist ein verwandtes, aber unabhängiges Konzept. Sie können auf einer EGLSurface zeichnen, die nicht von einer Surface unterstützt wird, und Sie können eine Surface ohne EGL verwenden. EGLSurface bietet GLES einen Ort zum Zeichnen.
Informationen zu den OpenGL ES- und EGL-Anforderungen finden Sie im Compatibility Definition Document für Android.
ANativeWindow
Die öffentliche Oberflächenklasse wird in der Programmiersprache Java implementiert. Das Äquivalent in C/C++ ist die ANativeWindow-Klasse, die teilweise über das Android NDK verfügbar gemacht wird. Sie können das ANativeWindow-Objekt über den Aufruf ANativeWindow_fromSurface()
aus einer Oberfläche abrufen. Wie bei der Java-Version können Sie sie sperren, in der Software rendern und entsperren und posten. Der grundlegende nativen Fenster-Typ ist die Erstellerseite einer BufferQueue.
Wenn Sie eine EGL-Fensterfläche aus nativem Code erstellen möchten, übergeben Sie eine Instanz von EGLNativeWindowType an eglCreateWindowSurface()
. EGLNativeWindowType ist ein Synonym für ANativeWindow. Sie können also einen Typ in den anderen umwandeln.