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

En android, la documentación GLSurfaceView dice esto:

Un GLSurfaceView debe ser notificado cuando la actividad se detiene y se reanuda. Los clientes GLSurfaceView deben llamar a OnPause () cuando la actividad se detiene y onResume () cuando se reanuda la actividad. Estas llamadas permiten GLSurfaceView para detener y reanudar el subproceso de representación y también permiten GLSurfaceView para liberar y volver a crear la presentación OpenGL.

Así que 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 llamo onPause() y onResume() entonces el contexto no se pierde cuando onResume() el botón de inicio, así que puedo cambiar entre las aplicaciones y luego volver a mi juego y todo es trabajando. Lo que veo es que si cierro el juego usando el botón Atrás, la pantalla es negra cuando la vuelvo a abrir, pero puedo cambiar el comportamiento del botón de retroceso para cerrar totalmente el juego y evitar este problema.

Así que mi pregunta es: ¿cuándo se destruye el contexto de OpenGL ? Si no llamo onPause() y onResume() ¿puedo asumir que nunca será destruido?

EDITAR:

Tengo como objetivo Android 2.2, por lo que setPreserveEGLContextOnPause() no es una opción para mí.

El OpenGL se puede perder sólo después de que Actvity :: onPause () se llama y sólo en este caso. Consulte la documentación 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 sólo pueden soportar un número limitado de contextos EGL deben liberar el contexto EGL para permitir que varias aplicaciones compartan la GPU. […] el contexto EGL [puede liberarse] cuando GLSurfaceView se pausa y se vuelve a crear cuando GLSurfaceView se reanuda.

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 un gran inconveniente es la implementación de Android OGLES: no se puede estar seguro.

La documentación en sí es vaga (nota perdida de contexto EGL):

Hay situaciones en las que se perderá el contexto de renderizado de EGL. Esto suele suceder cuando el dispositivo se despierta después de ir a dormir

Me di cuenta del mismo comportamiento que usted sobre el botón Inicio y Atrás. Las llamadas no son exactamente las mismas (pero no las recuerdo con precisión).

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

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

Si se establece en true, el contexto EGL puede conservarse cuando se pone en pausa GLSurfaceView. […]

SetPreserveEGLContextOnPause es una opción para ti, solo tienes que implementar GlSurfaceView tú mismo.

Vea mi respuesta aquí a una pregunta similar: Prevenir onPause de la basura OpenGL Context

  • GL_OUT_OF_MEMORY después de una llamada a glDrawArrays. ¿Por qué?
  • ¿Qué es Matrix.frustumM (mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7); en OpenGL ES 20?
  • Cambio de OpenGL ES 1.0 a 2.0
  • dibujando un círculo en android con openGL
  • GlTexSubImage2D es más lento con objetos de búfer de píxeles
  • ¿Cuál es la forma más fácil de dibujar línea con OpenGL-ES (android)
  • OpenGL ES Vertex / Indicies
  • Por qué las funciones de OpenGL ES no se pueden llamar desde otro subproceso
  • ¿Es posible renderizar en RGB888 con OpenGL?
  • Aplicación de gluUnProject Android OpenGL ES 1.1
  • Escalado de vista de superficie OpenGL para diferentes DPI
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.