instalar - opengl es 3.1 apk android download
Evita que OnPause destruya el contexto de OpenGL (4)
Como se mencionó en un comentario anterior, también es posible evitar destruir el contexto GL en versiones anteriores de Android (1.x, 2.x), la solución es copiar GLSurfaceView desde el código fuente del SDK de Android-15, cambiar su nombre de paquete y luego use su propia copia de GlSurfaceView.
Debería funcionar para dispositivos que admiten múltiples contextos GL (excepto los chips Adreno, en este momento), independientemente de la versión de Android. Una advertencia es que GLSurfaceView de Android-15 solo contiene lo necesario para trabajar con Android-15, nuestra versión debe manejar todas las versiones del sistema operativo.
Utilizamos nuestra propia implementación de GlSurfaceView basada en una copia de ReplicaIsland, donde Chriss Pruit también usó su propia implementación.
En nuestra versión, agregamos el setPreserveEGLContextOnPause del SDK-15, que permite preservar el contexto de GL en, por ejemplo, un nexo con Android 2.3.
También hemos cambiado otras cosas para satisfacer nuestras necesidades, lo que no es relevante para esta pregunta (como la representación de 32 bits en los teléfonos que la admiten, de lo contrario, de 16 bits).
Nuestro GlSurfaceView: http://pastebin.com/U4x5JjAr
Aquí está la versión SDK-15 original de GlSurfaceView formateada por el mismo estilo (Android) que el anterior http://pastebin.com/hziRmB3E (para que sea fácil de comparar y ver los cambios)
Recuerda habilitar la preservación del contexto llamando a:
glSurfaceView.setPreserveEGLContextOnPause(true);
Estoy escribiendo una aplicación de Android que utiliza OpenGL ES (GLSurfaceView y GLSurfaceView.Renderer). El problema es que cuando el usuario cambia de aplicación y luego vuelve a mi aplicación, GLSurfaceView destruye y recrea el contexto de GL. Esto es lo que se supone que debe hacer de acuerdo con la documentación, pero ¿hay alguna manera de evitar que esto suceda?
Lleva mucho tiempo cargar texturas en el contexto y me gustaría evitar tener que volver a cargarlas.
Creo que lo que estás buscando se discute en la documentación de GLSurfaceView:
Se debe notificar a GLSurfaceView cuando la actividad se detiene y se reanuda. Se requiere que los clientes de GLSurfaceView llamen a Pausa () cuando la actividad se detenga y onResume () cuando la actividad se reanude. Estas llamadas permiten a GLSurfaceView pausar y reanudar el subproceso de representación, y también permiten a GLSurfaceView liberar y recrear la pantalla OpenGL.
Cuando utilice el SDK de Android estándar, debe liberar / volver a crear su contexto cada vez que la actividad se detenga / reanude (incluidos los cambios de orientación de la pantalla). Si no lo hace, el contexto GL se liberará y no se restaurará cuando la actividad se cargue nuevamente en la memoria. Recuerde que estamos tratando con recursos muy limitados (especialmente en dispositivos de baja especificación). Así que la respuesta corta es: no puedes evitarlo sin romper tu aplicación.
Suponiendo que está utilizando el marco estándar de Android / OpenGL, debe hacer lo siguiente ...
En su actividad, asegúrese de tener los siguientes métodos anulados:
public void onPause() {
myGlSurfaceView.onPause();
}
public void onResume() {
myGlSurfaceView.onResume();
}
Sin embargo, todo lo que se mantenga fuera del entorno de GL aún deberá conservarse y restaurarse manualmente (mapas de bits, estado del juego, etc.), para lo cual deberá usar campos estáticos o un mecanismo como SharedPreferences.
Actualizar
Android 3.x proporciona una función para preservar el contexto GL en pausa sin necesidad de ser recreado. Sin embargo, hay varias advertencias:
- Las funciones de Android 3.x no están disponibles para aprox. 90% de los dispositivos en el mercado en este momento.
- Los dispositivos también deben admitir múltiples contextos EGL, no está claro cuántos dispositivos en el mercado soportan esto actualmente.
Usando un poco de reflexión de API para verificar las capacidades, puede ser posible hacer uso de esta función en dispositivos compatibles. Sin embargo, todavía necesitaría volver a recrear el contexto para el resto. En mi opinión, hasta que más dispositivos ejecuten Android 3, sería mejor suspender el uso de setPreserveEGLContextOnPause
y centrarse en garantizar que el enfoque de recreación del contexto esté suficientemente probado.
Desde el nivel de API 11, puede especificar si su contexto debe ser preservado o no.
Desde el doc:
public void setPreserveEGLContextOnPause (preserveOnPause booleano) desde: API nivel 11
Controle si el contexto de EGL se conserva cuando el GLSurfaceView se detiene y se reanuda.
Si se establece en verdadero, entonces el contexto EGL puede conservarse cuando la GLSurfaceView está en pausa. Si el contexto de 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 de EGL o no. Los dispositivos que solo pueden admitir un número limitado de contextos EGL deben liberar el contexto EGL para permitir que múltiples aplicaciones compartan la GPU.
Si se establece en falso, el contexto EGL se liberará cuando la GLSurfaceView esté en pausa y se volverá a crear cuando se reanude la GLSurfaceView.
El valor predeterminado es falso.
Los parámetros preserveOnPause conservan el contexto EGL cuando están en pausa
Ha pasado un tiempo desde que trabajé con OpenGL y era el tipo estándar en las PC de escritorio, pero parece recordar que el OpenGL estándar no requiere una recarga de texturas en el cambio de contexto. Por supuesto, eso no ayuda en este caso.
Suponiendo que las texturas deben recargarse, la pregunta es: ¿cómo acelerar esto? Y luego la pregunta es: ¿cuántas texturas necesita en un momento dado y puede cargarlas a pedido? ¿Cuáles son sus dimensiones? Recuerdo que las potencias de dos solían ser más rápidas de cargar, aunque eso también puede depender de la implementación y los controladores de OpenGL.
También he escuchado sobre mantener un contexto en un lugar donde no se destruya, como este hilo: problema de cambio de vista de opengles