【发布时间】:2014-04-29 21:02:00
【问题描述】:
openGL 将纹理存储多长时间?
当你离开一个活动时,纹理内存会被回收吗?
例如,如果我有以下代码:
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];
哪些更改会使返回值无效?
我不想在我回到活动时重新加载我的所有纹理(比如那个人有一个电话),因为它确实会减慢速度。
更新:
在渲染器文档中找到此信息,这证实了@svdree 下面给出的答案:
EGL 上下文丢失 在某些情况下,EGL 渲染上下文会丢失。这通常发生在设备在进入睡眠状态后唤醒时。当 EGL 上下文丢失时,与该上下文关联的所有 OpenGL 资源(例如纹理)将被自动删除。为了保持正确渲染,渲染器必须重新创建它仍然需要的任何丢失的资源。 onSurfaceCreated(GL10, EGLConfig) 方法是一个方便的地方。
这意味着纹理与 EGL 上下文相关
自从发布此问题以来,我试图通过让我的活动继承自引用自定义 GLRenderer 的基本活动来解决问题。基本上,我可以将 OpenGLSurface View 向前传递(即,让它在一个活动中实例化它并在下一个活动中使用它),但是一旦它完成关闭过程,它就不会再次启动。
我还发现,使您的活动透明可以保留透明活动下方的 openGL 上下文(这很有意义,但仅对菜单等有帮助)。但是我想在 openGL 活动之后总是可以让每个活动都稍微透明一点,从而在所有活动中保留背景中的纹理(这可能是我要做的)
【问题讨论】: