2012-06-16 15 views
13

en Android, la documentación GLSurfaceView dice esto:Android: ¿Cuándo se destruye el contexto OpenGL?

Un GLSurfaceView debe ser notificado cuando se detiene la actividad y reanudó. Los clientes GLSurfaceView deben llamar a OnPause() cuando se detiene la actividad y onResume() cuando se reanuda la actividad. Estas llamadas permiten a GLSurfaceView pausar y reanudar el hilo de representación, y también permiten a GLSurfaceView liberar y recrear la pantalla de OpenGL.

Así que tengo que 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 presiono el botón de inicio, entonces puedo cambiar entre aplicaciones y luego volver a mi juego y todo está funcionando. 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.

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

EDIT:

he orientado Android 2.2, por lo setPreserveEGLContextOnPause() no es una opción para mí.

+0

Sería curioso saber el valor de myGlSurfaceView.getPreserveEGLContextOnPause(). Si eso está establecido en verdadero, entonces tu contexto puede ser preservado. Consulte http://developer.android.com/reference/android/opengl/GLSurfaceView.html#setPreserveEGLContextOnPause(boolean) para obtener más información. –

+0

@RodHyde lo siento, me olvidé de decir que me estoy dirigiendo a Android 2.2 – Damian

+0

Aquí hay un código que usa GLSurface para dibujar. http://code.google.com/p/andengine/source/browse/src/org/anddev/andengine/opengl/view/GLSurfaceView.java?r=ef54dd94f1fe8fa9ed134d993802c3c9974d3a84 –

Respuesta

24

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

si el contexto de EGL es en realidad conservado o no depende de si el dispositivo Android que el programa se está ejecutando en puede soportar 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 [se puede] liberar cuando GLSurfaceView se pausa y se vuelve a crear cuando se reanuda GLSurfaceView.

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

El documentation sí es vaga (EGL Contexto nota Perdido):

Hay situaciones en las que se pierde el contexto de representación EGL. Esto generalmente ocurre cuando el dispositivo se despierta después de irse a dormir

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

La única manera de estar seguro de que el contexto de OpenGL está disponible es la creación de todos los recursos de OpenGL en onSurfaceCreated

Nota sobre setPreserveEGLContextOnPause. Una vez más, esto demuestra el comportamiento documentation comment "al azar" de la destrucción contexto:

Si es verdadero, entonces el contexto de EGL puede conservarse cuando se detiene el GLSurfaceView. [...]

+0

lo siento, se me olvidó decir que me estoy orientando a Android 2.2 – Damian

+0

También trabajo en Android 2.2. En este caso, setPreserveEGLContextOnPause no está disponible, pero no cambia la forma en que se pierde el contexto OpenGL ... – rockeye

+0

Todavía no está claro para mí. Entonces, si no invoco onPause() de GLSurfaceView y manejo la tecla de retroceso para cerrar la aplicación después de pedir confirmación, ¿el contexto nunca será destruido? – Damian

1

setPreserveEGLContextOnPause es una opción para usted, solo tiene que implementar el GlSurfaceView usted mismo.

Véase mi respuesta para una pregunta similar: Prevent onPause from trashing OpenGL Context

+0

¿Qué sucede en los dispositivos Adreno que utilizan su implementación GlSurfaceView? – Damian

Cuestiones relacionadas