2011-08-15 17 views
6

¿Por cuánto tiempo OpenGL almacena una textura?Android: ¿Por cuánto tiempo OpenGL almacena una textura?

¿Se recicla la memoria de textura cuando abandona una actividad?

Por ejemplo, si tengo el siguiente código:

mGL.glGenTextures(1, mTextures, 0); 
     mGL.glBindTexture(GL10.GL_TEXTURE_2D, mTextures[0]); // A bound texture is 
                  // an active texture 

     //mGL.glTexImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_RGBA, bitmap.getWidth(),bitmap.getHeight(), 0, GL10.GL_RGBA, GL10.GL_FLOAT, textures); 
     GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0,GL10.GL_RGBA, bitmap, 0); 

     // create nearest filtered texture 
     mGL.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, 
       GL10.GL_LINEAR); // This is where the scaling algorithms are 
     mGL.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, 
       GL10.GL_LINEAR); // This is where the scaling algorithms are 
     mGL.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, 
       GL10.GL_CLAMP_TO_EDGE); 
     mGL.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, 
       GL10.GL_CLAMP_TO_EDGE); 
     GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); 

     //bitmap.recycle(); 
     Log.v("GLSurfaceView", "Loading Texture Finished"); 
     return mTextures[0]; 

¿Qué cambios se invalida el valor de retorno?

No quiero volver a cargar todas mis texturas cuando vuelvo a una actividad (digamos que la persona tenía una llamada telefónica) porque realmente ralentiza las cosas.

Actualización:

encontrado esta información en la documentación Renderizador, lo que confirma la respuesta dada a continuación por @svdree:

EGL Contexto 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. Cuando se pierde el contexto EGL, todos los recursos OpenGL (como texturas) que están asociados con ese contexto se eliminarán automáticamente. Para seguir renderizando correctamente, un procesador debe recrear los recursos perdidos que aún necesita. El método onSurfaceCreated (GL10, EGLConfig) es un lugar conveniente para hacer esto.

Eso significa que las texturas se relacionan con el contexto de EGL

Desde la publicación de esta pregunta he intentado resolver el problema haciendo que mis actividades heredan de una actividad de base que tiene una referencia a un GLRenderer personalizado. Básicamente, puedo pasar la Vista OpenGLSurface hacia adelante (es decir, hacer que la instancia en una actividad y usarla en la siguiente), pero una vez que pasa por su procedimiento de apagado no se inicia de nuevo.

También he encontrado que al hacer que sus actividades sean transparentes se conserva el contexto de OpenGL debajo de la actividad transparente (lo cual tiene sentido, pero solo ayuda con los menús y demás). Sin embargo, supongo que sería posible tener siempre todas las actividades después de que la actividad de OpenGL sea solo un poco transparente, conservando así las texturas en segundo plano en todas tus actividades (esto es probablemente lo que haré)

Respuesta

1

Cuando salgas una actividad, su contexto OpenGL se perderá, lo que significa que todas sus texturas, objetos de búfer de vértice, etc. tendrán que volver a crearse. Esto generalmente se hace en el método onSurfaceCreated() de la clase GLSurfaceView.Renderer.

+0

puedo pasar el contexto a una actividad nueva, o de alguna manera guardarlo. Me preocupa el caso en el que alguien atiende una llamada y luego regresa a mi aplicación y todas las texturas tienen que volver a cargarse. – tjb

+0

Se pierde un contexto perdido, no se puede guardar. "Perder" un contexto generalmente indica que el sistema tenía algo más que hacer, o un error, y requiere que recree todos los recursos de video. – ssube

+0

Este es un patrón de diseño común en Android; cada vez que otra actividad pasa al frente, debe liberar sus recursos para que la otra actividad pueda usarlos (realmente útil en sistemas con recursos limitados). Esta es una funcionalidad incorporada en GLSurfaceView. Sospecho que puede solucionar esto escribiendo su propia versión de GLSurfaceView, pero no lo recomendaría. Además, si le das prioridad a las cosas que son realmente visibles cuando cargas tus recursos nuevamente, no tiene por qué ser tan lento. – svdree

0

onPause() arroja la mayoría de los controladores OpenGL, etc. ¡Buena suerte en OpenGL Land!

Cuestiones relacionadas