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.
- Procesamiento de imágenes Android OpenGL - sin SurfaceView
- ¿Cómo puedo determinar lo que se toca en el espacio 3D de la pantalla?
- Ejecutar Android OpenGL en el fondo como recurso de renderizado para la aplicación?
- Problema dibujo de una esfera en OPENGL ES
- (OpenGL ES) Los objetos alejados del centro de la vista se estiran
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í.
- Android Opengl ES motor de mosaico, desplazamiento suave
- ¿Cómo deshacerse de los bordes dentados en Android OpenGL ES?
- Juego opengl android
- Imagen distorsionada de Android OpenGL ES
- Openg GL 2.0 error de Android 0x501 (GL_INVALID_VALUE)
- Android Aplicar efecto en el marco de la cámara
- Android Opengl ES: GLUtils.glTexImage2D causando GL_INVALID_ENUM
- Error 1 libavcodec.so Formato de archivo no reconocido Android GL Live Wallpaper
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
- Galaxy S3: tomar fotos en modo retrato destruye actividad
- Clic en el elemento programáticamente en RecyclerView