La documentación de Android dice:
Hay situaciones en las que se perderá el contexto de representación EGL. Esto generalmente ocurre cuando el dispositivo se despierta después de ir a dormir. Cuando se pierde el contexto EGL, todos los recursos de OpenGL (como las texturas) asociados con ese contexto se eliminarán automáticamente. Para seguir renderizando correctamente, un renderizador debe recrear los recursos perdidos que aún necesita. El método onSurfaceCreated (GL10, EGLConfig) es un lugar conveniente para hacer esto.
Pero tener que volver a cargar todas las texturas en el contexto de OpenGL es a la vez doloroso y perjudica la experiencia del juego para el usuario cuando vuelve a ingresar a la aplicación después de una pausa. Sé que "Angry Birds" de alguna manera evita esto, ¿estoy buscando sugerencias sobre cómo lograr lo mismo?
Estoy trabajando con Android NDK r5 (versión CrystaX). Encontré este posible truco para el problema, pero estoy tratando de evitar construir una versión SDK personalizada completa.
Respuestas:
Replica Island tiene una versión modificada de GLSurfaceView que trata este problema (y funciona con versiones anteriores de Android). De acuerdo con Chris Pruett :
Editar: Me acabo de dar cuenta de que ya has publicado el enlace a un truco similar. No creo que haya una solución incorporada antes del panal. Replica Island es un juego popular que funciona en muchos dispositivos y es posible que la implementación y los comentarios de Chris sean útiles.
fuente
Me gustaría agregar otra respuesta a esto que Chris Pruett me transmitió hace uno o dos años (Replica Island, Wind-Up Knight, etc.). Es especialmente útil aquí en 2013, ya que setPreserveEglContextOnPause (true) no parece funcionar en 4.3. (Podría estar equivocado al respecto, pero así es como me parece ahora que actualizo el último código del juego en 2011).
Básicamente, el truco es separar su GLSurfaceView de la jerarquía de vistas de onPause () de su Actividad. Como no está en la jerarquía de vistas en el punto en que se ejecuta onPause (), el contexto nunca se destruye.
Entonces su Actividad en onPause () debería verse así:
Y restaura su GLSurfaceView a la jerarquía no desde onResume () sino desde onWindowFocusChanged ():
Tenga en cuenta que nunca llama a onPause () y onResume () de GLSurfaceView y que este es el SDK GLSurfaceView oficial, no se requiere una versión alternativa pirateada.
fuente
<rant> Pasé una gran cantidad de tiempo en este problema, probé muchas soluciones diferentes y ninguna funcionó hasta hoy, creo que esta es una de las decisiones de diseño más horribles que he visto, pero al provenir del equipo de Android no estoy Realmente sorprendido. </ rant>
Por lo tanto, la solución es mover el miembro eglContext hacia arriba y hacerlo estático (global) para que no se destruya, entonces simplemente debe verificar si es nulo o no antes de volver a crearlo.
Hasta ahora, esta solución parece funcionar para nosotros, y no nos importa si se rompe en los dispositivos de 2005.
fuente
Use API de panal. Hay una opción para preservar su contexto OGL. De lo contrario, debe volver a cargar su contexto. No es difícil ni doloroso.
Debe comprender que hay dos casos (Android 2.1):
Nota: los viejos gpus de Android no son compatibles con el contexto múltiple. Por lo tanto, el contexto opengl se pierde cuando cambia a otra aplicación => no hay solución disponible (puede piratear para preservar su contexto en la pausa de la pantalla).
Nota 2: la función HoneyComb se establece en PreserveEGLContextOnPause
fuente
Algunas de las respuestas aquí son razonables para los primeros usos de OpenGL ES en Android. Los primeros dispositivos GLES solo admitían un contexto único, por lo que GLSurfaceView fue diseñado para descartar agresivamente el estado. Convencer a GLSurfaceView de hacer lo contrario no es fácil.
Para versiones más recientes de Android (probablemente cualquier cosa que use GLES 2.x), la mejor respuesta es usar un SurfaceView simple y hacer su propio EGL y administración de hilos. Puede encontrar varios ejemplos de GLES utilizados con un SurfaceView simple en Grafika , incluida una biblioteca de clases simples para crear y destruir contextos EGL.
Todavía es una buena práctica descargar el estado cuando una aplicación pasa a segundo plano, pero para el ejemplo de Chris Pruett, donde la aplicación todavía estaba en primer plano, pero la actividad que alojaba GLSurfaceView fue desactivada, no hay ningún valor en el desgarro por el contexto.
fuente