Google 致力于为黑人社区推动种族平等。查看具体举措
Questa pagina è stata tradotta dall'API Cloud Translation.
Switch to English

EGLSurfaces e OpenGL ES

Android utilizza l' API OpenGL ES (GLES) per 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 testurizzati, mentre le chiamate EGL inseriscono i rendering sugli schermi.

Prima di disegnare con GLES, è necessario 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é essere passato come argomento. Il codice di rendering deve essere eseguito su un thread GLES corrente, non sul thread dell'interfaccia utente.

EGLSurfaces

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 un oggetto finestra come argomento, che su Android è una superficie. Una superficie è il lato produttore di una BufferQueue. I consumatori , che sono SurfaceView, SurfaceTexture, TextureView o ImageReader, creano superfici. Quando si chiama eglCreateWindowSurface() , EGL crea un nuovo oggetto EGLSurface e lo collega all'interfaccia del produttore della BufferQueue dell'oggetto finestra. Da quel punto in poi, il rendering a quella EGLSurface si traduce in un buffer che viene rimosso dalla coda, sottoposto a rendering e accodato per essere utilizzato dal consumatore.

EGL non fornisce chiamate di blocco / sblocco. Emettere i 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 una EGLSurface può essere associata a una superficie alla volta (puoi avere un solo producer connesso a BufferQueue), ma se distruggi la EGLSurface si disconnette da 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. È possibile disegnare su una superficie EGL che non è supportata da una superficie e utilizzare una superficie senza EGL. EGLSurface fornisce solo a GLES un punto in cui 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 da Android NDK . È possibile 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 della finestra EGL dal codice nativo, passare un'istanza di EGLNativeWindowType a eglCreateWindowSurface() . EGLNativeWindowType è un sinonimo di ANativeWindow, quindi puoi eseguire il cast di uno nell'altro.