【问题标题】:Android: For how long does OpenGL store a texture?Android:OpenGL 将纹理存储多长时间?
【发布时间】: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 活动之后总是可以让每个活动都稍微透明一点,从而在所有活动中保留背景中的纹理(这可能是我要做的)

【问题讨论】:

    标签: android opengl-es


    【解决方案1】:

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

    【讨论】:

    • 我可以将上下文传递给一个新的活动,或者以某种方式保存它。我担心有人接听电话然后回到我的应用程序并且所有纹理都必须重新加载的情况。
    • 丢失的上下文丢失,无法保存。 “丢失”上下文通常表示系统有其他事情要做,或者发生了错误,并且需要您重新创建所有视频​​资源。
    • 这是Android中常见的设计模式;每当另一个活动出现在最前面时,您需要释放资源以便其他活动可以使用它们(对于资源有限的系统非常有用)。这是 GLSurfaceView 中的内置功能。我怀疑您可以通过编写自己的 GLSurfaceView 版本来解决此问题,但我不建议这样做。此外,如果您在再次加载资源时优先考虑实际可见的内容,则不必那么慢。
    【解决方案2】:

    onPause() 会抛出大多数 openGL 句柄等!祝你在 openGL 领域好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-10
      • 2015-05-06
      相关资源
      最近更新 更多