Android utilizza l'API OpenGL ES (GLES) per eseguire il rendering della grafica. Per creare contesti GLES e fornire un sistema di finestre per i rendering GLES, Android utilizza la libreria EGL . Le chiamate GLES eseguono il rendering di poligoni con texture, mentre le chiamate EGL inseriscono i rendering sugli schermi.
Prima di disegnare con GLES, devi creare un contesto GL. In EGL, ciò significa creare un EGLContext e un EGLSurface. Le operazioni GLES si applicano al contesto corrente, a cui si accede tramite l'archiviazione locale del thread anziché passato come argomento. Il codice di rendering deve essere eseguito su un thread GLES corrente, non sul thread dell'interfaccia utente.
EGLSurfici
EGLSurface può essere un buffer fuori schermo allocato da EGL, chiamato pbuffer , o una finestra allocata dal sistema operativo. La chiamata alla funzione eglCreateWindowSurface()
crea le superfici della finestra EGL. eglCreateWindowSurface()
accetta come argomento un oggetto finestra , che su Android è una superficie. Una superficie è il lato produttore di BufferQueue. I consumatori , che sono SurfaceView, SurfaceTexture, TextureView o ImageReader, creano superfici. Quando chiami eglCreateWindowSurface()
, EGL crea un nuovo oggetto EGLSurface e lo connette all'interfaccia del produttore del BufferQueue dell'oggetto finestra. Da quel momento in poi, il rendering su EGLSurface comporta la rimozione della coda, il rendering e la messa in coda di un buffer per l'utilizzo da parte del consumatore.
EGL non fornisce chiamate di blocco/sblocco. Emettere comandi di disegno e quindi chiamare eglSwapBuffers()
per inviare il fotogramma corrente. Il nome del metodo deriva dal tradizionale scambio dei buffer anteriori e posteriori, ma l'effettiva implementazione potrebbe essere diversa.
È possibile associare solo una EGLSurface alla volta a una superficie (è possibile avere un solo produttore connesso a BufferQueue), ma se si distrugge EGLSurface si disconnette da BufferQueue e consente a qualcos'altro di connettersi.
Un dato thread può passare tra più EGLSurface modificando ciò che è corrente . Una EGLSurface deve essere corrente su un solo thread alla volta.
EGL non è un altro aspetto di una superficie (come SurfaceHolder). EGLSurface è un concetto correlato ma indipendente. È possibile disegnare su una EGLSurface che non è supportata da una superficie e utilizzare una superficie senza EGL. EGLSurface fornisce semplicemente a GLES un posto dove disegnare.
Fare riferimento al documento di definizione della compatibilità Android per i requisiti OpenGL ES ed EGL.
ANativeWindow
La classe di superficie pubblica è implementata nel linguaggio di programmazione Java. L'equivalente in C/C++ è la classe ANativeWindow, semi-esposta dall'NDK di Android . Puoi ottenere ANativeWindow da una superficie con la chiamata ANativeWindow_fromSurface()
. Proprio come il suo cugino in linguaggio Java, puoi bloccarlo, eseguire il rendering nel software e sbloccare e pubblicare. Il tipo di finestra nativa di base è il lato produttore di BufferQueue.
Per creare una superficie di finestra EGL dal codice nativo, passare un'istanza di EGLNativeWindowType a eglCreateWindowSurface()
. EGLNativeWindowType è un sinonimo di ANativeWindow, quindi puoi trasmetterne uno all'altro.