EGLSurfaces und OpenGL ES

Android verwendet die OpenGL ES (GLES) API, um Grafiken zu rendern. Android verwendet die EGL-Bibliothek, um GLES-Kontexte zu erstellen und ein Fenstersystem für GLES-Renderings bereitzustellen. GLES-Aufrufe rendern strukturierte Polygone, während EGL-Aufrufe Renderings auf Bildschirmen platzieren.

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

EGL-Oberflächen

Die EGL-Oberfläche kann ein von der EGL zugewiesener Off-Screen-Puffer, der als p -Puffer bezeichnet wird, oder ein vom Betriebssystem zugewiesenes Fenster sein. Durch Aufrufen der Funktion eglCreateWindowSurface() werden EGL-Fensteroberflächen erstellt. eglCreateWindowSurface() ein Fensterobjekt als Argument, das unter Android eine Oberfläche ist. Eine Oberfläche ist die Produzentenseite einer BufferQueue. Verbraucher , bei denen es sich um SurfaceView, SurfaceTexture, TextureView oder ImageReader handelt, 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 diese EGLSurface dazu, dass ein Puffer aus der Warteschlange entfernt, gerendert und zur Verwendung durch den Verbraucher in die Warteschlange gestellt wird.

EGL bietet keine Sperr- / Entsperranrufe an. eglSwapBuffers() Zeichenbefehle aus und rufen eglSwapBuffers() dann eglSwapBuffers() auf, um den aktuellen Frame zu senden. Der Methodenname stammt aus dem traditionellen Austausch von vorderen und hinteren Puffern, die tatsächliche Implementierung kann jedoch unterschiedlich sein.

Es kann jeweils nur eine EGLSurface einer Oberfläche zugeordnet werden (Sie können nur einen Produzenten mit einer BufferQueue verbinden). Wenn Sie jedoch die EGLSurface zerstören, wird die Verbindung zur BufferQueue getrennt und eine andere Verbindung hergestellt.

Ein bestimmter Thread kann zwischen mehreren EGLSurfaces wechseln, indem er den aktuellen Wert ändert. Eine EGLSurface darf jeweils nur auf 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 eine EGL-Oberfläche zeichnen, die nicht von einer Oberfläche hinterlegt ist, und Sie können eine Oberfläche ohne EGL verwenden. EGLSurface bietet GLES lediglich einen Ort zum Zeichnen.

Informationen zu den OpenGL ES- und EGL-Anforderungen finden Sie im Dokument zur Definition der Android- Kompatibilität .

ANativeWindow

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

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