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 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, einen EGLContext und eine EGLSurface zu erstellen. GLES-Operationen gelten für den aktuellen Kontext, auf den über den Thread-lokalen Speicher zugegriffen wird, anstatt als Argument übergeben zu werden. Rendering-Code sollte auf einem aktuellen GLES-Thread ausgeführt werden, nicht auf dem UI-Thread.
EGLOberflächen
EGLSurface kann ein von EGL zugewiesener Off-Screen-Puffer sein, der als pbuffer bezeichnet wird, oder ein vom Betriebssystem zugewiesenes Fenster. Durch Aufrufen der Funktion eglCreateWindowSurface()
werden EGL-Fensteroberflächen erstellt. eglCreateWindowSurface()
nimmt ein Fensterobjekt als Argument, das auf Android eine Oberfläche ist. Eine Oberfläche ist die Produzentenseite einer BufferQueue. Consumer , 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 Produzentenschnittstelle der BufferQueue des Fensterobjekts. Von diesem Punkt an führt das Rendern zu dieser EGL-Oberfläche dazu, dass ein Puffer aus der Warteschlange genommen, in ihn gerendert und zur Verwendung durch den Verbraucher in die Warteschlange eingereiht wird.
EGL stellt keine Aufrufe zum Sperren/Entsperren bereit. Geben Sie Zeichenbefehle aus und rufen Sie dann eglSwapBuffers()
auf, um den aktuellen Frame zu übermitteln. Der Methodenname stammt vom traditionellen Austausch von Front- und Back-Buffer, aber die tatsächliche Implementierung kann anders sein.
Es kann jeweils nur eine EGLSurface mit einer Oberfläche verknüpft werden (es kann nur ein Producer mit einer BufferQueue verbunden sein), aber wenn Sie die EGLSurface zerstören, trennt sie sich von der BufferQueue und lässt etwas anderes eine Verbindung herstellen.
Ein bestimmter Thread kann zwischen mehreren EGL-Oberflächen 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 (wie SurfaceHolder). EGLSurface ist ein verwandtes, aber unabhängiges Konzept. Sie können auf einer EGL-Oberfläche zeichnen, die nicht von einer 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 -Kompatibilitätsdefinitionsdokument .
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 von ANativeWindow_fromSurface()
. 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 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 einen in den anderen umwandeln können.