Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

EGLSurfaces y OpenGL ES

Android usa la API de OpenGL ES (GLES) para renderizar gráficos. Para crear contextos GLES y proporcionar un sistema de ventanas para las representaciones GLES, Android usa la biblioteca EGL . Las llamadas GLES renderizan polígonos texturizados, mientras que las llamadas EGL ponen renderizados en pantallas.

Antes de dibujar con GLES, debe crear un contexto GL. En EGL, esto significa crear un EGLContext y un EGLSurface. Las operaciones GLES se aplican al contexto actual, al que se accede a través del almacenamiento local de subprocesos en lugar de pasar como un argumento. El código de renderizado debe ejecutarse en un hilo GLES actual, no en el hilo de la interfaz de usuario.

EGLSuperficies

EGLSurface puede ser un búfer fuera de la pantalla asignado por EGL, llamado pbuffer , o una ventana asignada por el sistema operativo. Llamar a la función eglCreateWindowSurface() crea superficies de ventana EGL. eglCreateWindowSurface() toma un objeto de ventana como argumento, que en Android es una superficie. Una superficie es el lado del productor de una BufferQueue. Los consumidores , que son SurfaceView, SurfaceTexture, TextureView o ImageReader, crean superficies. Cuando llama a eglCreateWindowSurface() , EGL crea un nuevo objeto EGLSurface y lo conecta a la interfaz de productor de BufferQueue del objeto de ventana. A partir de ese momento, la renderización en esa EGLSurface da como resultado un búfer que se retira de la cola, se procesa y se pone en cola para que lo use el consumidor.

EGL no proporciona llamadas de bloqueo / desbloqueo. Emita comandos de dibujo y luego llame a eglSwapBuffers() para enviar el marco actual. El nombre del método proviene del intercambio tradicional de búferes anteriores y posteriores, pero la implementación real puede ser diferente.

Solo se puede asociar un EGLSurface con una superficie a la vez (solo puede tener un productor conectado a un BufferQueue), pero si destruye el EGLSurface, se desconecta del BufferQueue y permite que algo más se conecte.

Un hilo dado puede cambiar entre múltiples EGLSurfaces cambiando lo que es actual . Un EGLSurface debe estar actualizado solo en un subproceso a la vez.

EGL no es otro aspecto de una superficie (como SurfaceHolder). EGLSurface es un concepto relacionado pero independiente. Puede dibujar en una EGLSurface que no esté respaldada por una superficie y puede usar una superficie sin EGL. EGLSurface solo proporciona a GLES un lugar para dibujar.

Consulte el Documento de definición de compatibilidad de Android para conocer los requisitos de OpenGL ES y EGL.

ANativeWindow

La clase de superficie pública se implementa en el lenguaje de programación Java. El equivalente en C / C ++ es la clase ANativeWindow, semiexpuesta por el NDK de Android . Puede obtener ANativeWindow de una superficie con la llamada ANativeWindow_fromSurface() . Al igual que su primo del lenguaje Java, puede bloquearlo, renderizarlo en software y desbloquearlo y publicarlo. El tipo de ventana nativa básica es el lado del productor de una BufferQueue.

Para crear una superficie de ventana EGL a partir de código nativo, pase una instancia de EGLNativeWindowType a eglCreateWindowSurface() . EGLNativeWindowType es un sinónimo de ANativeWindow, por lo que puede convertir uno al otro.