studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android opengl-es

programacion - Android: ¿Cuándo se destruye el contexto de OpenGL?



manual de programacion android pdf (2)

En Android, la documentación de GLSurfaceView dice esto:

Se debe notificar a GLSurfaceView cuando la actividad se pause y se reanude. Los clientes GLSurfaceView deben llamar a OnPause () cuando la actividad se detiene y onResume () cuando se reanuda la actividad. Estas llamadas permiten a GLSurfaceView pausar y reanudar el hilo de representación, y también permiten que GLSurfaceView libere y vuelva a crear la pantalla de OpenGL.

Entonces se supone que debo hacer algo como esto en mi actividad:

public void onPause() { myGlSurfaceView.onPause(); } public void onResume() { myGlSurfaceView.onResume(); }

Estoy observando en mi código que si no onPause() y onResume() entonces el contexto no se pierde cuando onResume() el botón de inicio, así puedo pasar de una aplicación a otra y luego volver a mi juego. trabajando. Lo que veo es que si cierro el juego con el botón Atrás, la pantalla se vuelve negra cuando lo abro de nuevo, pero puedo cambiar el comportamiento del botón Atrás para cerrar por completo el juego y evitar este problema.

Entonces mi pregunta es: ¿cuándo se destruye el contexto de OpenGL ? Si no onPause() y onResume() ¿puedo suponer que nunca se destruirá?

EDITAR:

Me estoy orientando a Android 2.2, por lo que setPreserveEGLContextOnPause() no es una opción para mí.


OpenGL puede perderse solo después de llamar a Actvity :: onPause (), y solo en este caso. Consulte la documentación de setPreserveEGLContextOnPause :

Si el contexto EGL se conserva realmente o no depende de si el dispositivo Android en el que se ejecuta el programa puede admitir un número arbitrario de contextos EGL o no. Los dispositivos que solo admiten un número limitado de contextos EGL deben liberar el contexto EGL para permitir que varias aplicaciones compartan la GPU. [...] el contexto EGL [puede ser] liberado cuando GLSurfaceView está en pausa , y recreado cuando se reanuda GLSurfaceView.

EDIT: la situación descrita en la documentación es válida en todas las versiones de Android. No importa si tiene acceso a setPreserveEGLContextOnPause

En mi opinión, este es uno de los principales inconvenientes de la implementación de Android OGLES: no se puede estar seguro.

La documentación en sí es vaga (EGL Context Lost note):

Hay situaciones en las que se perderá el contexto de representación de EGL. Esto normalmente ocurre cuando el dispositivo se despierta después de ir a dormir

Noté el mismo comportamiento que tú con el botón Inicio y Atrás. Las llamadas no son exactamente las mismas (pero no pueden recordarlas con precisión).

La única forma de asegurarse de que el contexto de OpenGL esté disponible es crear todos los recursos de OpenGL en onSurfaceCreated

Nota sobre setPreserveEGLContextOnPause . Una vez más, este comentario de documentación demuestra el comportamiento "aleatorio" de la destrucción del contexto:

Si se establece en verdadero, el contexto EGL puede conservarse cuando GLSurfaceView está en pausa. [...]