Android:OpenGL存储纹理多长时间?

tjb*_*tjb 6 android opengl-es

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];
Run Code Online (Sandbox Code Playgroud)

哪些更改会使返回值无效?

当我回到活动中时(我说这个人打过电话),我不想重新加载所有纹理,因为它确实减慢了速度.

更新:

在Renderer文档中找到此信息,该文档确认了@svdree下面给出的答案:

EGL上下文丢失在某些情况下,EGL渲染上下文将丢失.这通常发生在设备进入睡眠状态后唤醒时.当EGL上下文丢失时,将自动删除与该上下文关联的所有OpenGL资源(例如纹理).为了保持正确渲染,渲染器必须重新创建它仍然需要的任何丢失的资源.onSurfaceCreated(GL10,EGLConfig)方法是一个方便的地方.

这意味着纹理与EGL上下文相关

自发布此问题以来,我尝试通过让我的活动从具有对自定义GLRenderer的引用的基本活动继承来解决问题.基本上,我可以向前传递OpenGLSurface View(即使它在一个活动中实例化并在下一个活动中使用它),但是一旦它通过其关闭程序,它就不会再次启动.

我还发现,使您的活动透明可以保留透明活动下面的openGL上下文(这是有道理的,但仅对菜单等有帮助).但是我想在openGL活动之后总是可以进行所有活动,只需要透明一点,从而在所有活动中保留背景纹理(这可能就是我要做的)

svd*_*ree 1

当您离开活动时,您的 OpenGL 上下文将丢失,这意味着您所有的纹理、顶点缓冲区对象等都需要重新创建。这通常在GLSurfaceView.Renderer类的onSurfaceCreated()方法中完成。