Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Cómo inicializar y finalizar correctamente EGL en Android

Aunque hay muchas muestras alrededor de usar OpenGL ES en Android, todas parecen ser incorrectas (incluso las que vienen con Android SDK / NDK) con respecto a la inicialización / terminación de EGL. Y la fuente del problema es sólo en el modelo de aplicación de Android que hacen uso correcto de EGL extraño.

El problema real que EGL inicializó por el proceso del sistema operativo, mientras que todas las muestras de Android e incluso GLSurfaceView (en realidad la mayoría de las muestras sólo lo utilizan) implican la inicialización / terminación EGL por componente (Activity o WallpaperService). Y esto es completamente incorrecto debido al hecho de que todos los componentes se ejecutan en el mismo proceso! No hay ningún problema si la aplicación consta de un solo componente, pero esto es un problema si hay varios componentes en la aplicación y que están utilizando OpenGL ES cada uno.

Basta con considerar la situación cuando dos componentes de la aplicación que utilizan el OpenGL ES se ejecuta al mismo tiempo y uno de ellos terminó. Al terminar este componente llamaremos eglTerminate () (Mira el código fuente GLSurfaceView para ver de qué estoy hablando) y esto terminará el EGL para todo el proceso . ¡Y cualquier llamada de EGL de otro componente que ya funciona fallará a partir de este momento!

Tengo cheque de toneladas de ejemplos y todos ellos inicializar y terminar EGL por componente base (en realidad nadie que he visto hacer algo diferente de GLSurfaceView hacer, la mayoría de ellos sólo copia de GLSurfaceView internos).

Y ahora estoy interesado en encontrar una manera "correcta" de trabajar (con respecto a la inicialización / terminación) con EGL en Android.

La manera "apropiada" debe proporcionar:

  1. Inicialización EGL cuando se inicia cualquier primer componente que utilice EGL
  2. Terminación EGL cuando se termina el último componente que usa EGL
  3. Multithreading. No debe haber restricción en la manipulación EGL sólo desde el hilo de la aplicación principal.

Tenga en cuenta que (2) es esencial para minimizar el uso de recursos del sistema por la aplicación cuando no hay entidades activas que utilicen EGL / OpenGL ES.

¿Algunas ideas? O tal vez he pasado por alto algo sobre el EGL en Android?

Actualizar

Hay otro tema relacionado interesante:

Debido al hecho de que sólo se permite un contexto de renderizado activo por subproceso, sólo un componente a la vez puede usar OpenGL ES desde el subproceso principal normalmente. Tener más de un Componente que utiliza el OpenGL ES en el subproceso principal que se ejecuta al mismo tiempo dará lugar a problemas porque el último componente llamando eglMakeCurrent () implicitamente "sustituirá" los contextos de todos los Componentes por su propio (y esto realmente romperá completamente el Componentes lógica).

Actualización 2 (final)

Se reveló (gracias a Romain Guy ) que Android realmente tiene una solución interna para el problema de inicialización / terminación de EGL en una forma explícita (es contra la especificación de EGL y no se menciona en la documentación de Android) "referencia de conteo" dentro de eglInitialize ) Y eglTerminate () .

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.