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 rendono i poligoni strutturati, mentre le chiamate EGL mettono i rendering sugli schermi.
Prima di disegnare con GLES, devi creare un contesto GL. In EGL, questo significa creare un EGLContext e un EGLsurface. Le operazioni GLES si applicano al contesto corrente, a cui si accede tramite l'archiviazione thread-local anziché passare come argomento. Il codice di rendering dovrebbe essere eseguito su un thread GLES corrente, non sul thread dell'interfaccia utente.
EGLSuperfici
L'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 delle finestre EGL. eglCreateWindowSurface()
accetta un oggetto finestra come argomento, che su Android è una superficie. Una superficie è il lato produttore di un 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 di BufferQueue dell'oggetto finestra. Da quel momento in poi, il rendering su tale EGLsurface comporta l'eliminazione della coda, il rendering e la coda 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 frame corrente. Il nome del metodo deriva dal tradizionale scambio di buffer anteriore e posteriore, ma l'implementazione effettiva potrebbe essere diversa.
Solo un EGLSurface può essere associato a una superficie alla volta (puoi avere un solo produttore connesso a un BufferQueue), ma se distruggi l'EGLSurface si disconnette dal BufferQueue e lascia che qualcos'altro si connetta.
Un determinato thread può passare da più EGLsurfaces 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. Puoi disegnare su una EGLsurface che non è supportata da una superficie e puoi usare una superficie senza EGL. EGLsurface fornisce solo 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 public surface è implementata nel linguaggio di programmazione Java. L'equivalente in C/C++ è la classe ANativeWindow, semi-esposta da Android NDK . È possibile ottenere ANativeWindow da una superficie con la chiamata ANativeWindow_fromSurface()
. Proprio come il suo cugino in lingua 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 della finestra EGL dal codice nativo, passa un'istanza di EGLNativeWindowType a eglCreateWindowSurface()
. EGLNativeWindowType è sinonimo di ANativeWindow, quindi puoi trasmettere l'uno all'altro.