Android utiliza la API OpenGL ES (GLES) para representar gráficos. Para crear contextos GLES y proporcionar un sistema de ventanas para representaciones GLES, Android utiliza la biblioteca EGL . Las llamadas GLES renderizan polígonos texturizados, mientras que las llamadas EGL colocan renderizaciones en las pantallas.
Antes de dibujar con GLES, necesita 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 pasarse como argumento. El código de renderizado debe ejecutarse en un hilo GLES actual, no en el hilo de la interfaz de usuario.
EGLSurfaces
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 productor de un BufferQueue. Los consumidores , que son SurfaceView, SurfaceTexture, TextureView o ImageReader, crean superficies. Cuando llamas a eglCreateWindowSurface()
, EGL crea un nuevo objeto EGLSurface y lo conecta a la interfaz de productor del BufferQueue del objeto de ventana. A partir de ese momento, la renderización en esa EGLSurface da como resultado que un búfer se retire de la cola, se renderice y se ponga en cola para que lo utilice 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 buffers frontales 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 determinado puede cambiar entre múltiples EGLSurfaces cambiando lo que está actual . Una EGLSurface debe estar actualizada 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 superficie EGLSurface que no esté respaldada por una superficie y puede utilizar una superficie sin EGL. EGLSurface simplemente 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.
Una ventana nativa
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 desde una superficie con la llamada ANativeWindow_fromSurface()
. Al igual que su primo en lenguaje Java, puedes bloquearlo, renderizarlo en software y desbloquearlo y publicarlo. El tipo de ventana nativa básica es el lado productor de BufferQueue.
Para crear una superficie de ventana EGL a partir de código nativo, pase una instancia de EGLNativeWindowType a eglCreateWindowSurface()
. EGLNativeWindowType es sinónimo de ANativeWindow, por lo que puedes convertir uno en otro.