Android:什么时候OpenGL上下文被破坏?

时间:2012-06-16 23:42:25

标签: android opengl-es

在android上,GLSurfaceView文档说明了这一点:

  

当活动暂停时,必须通知GLSurfaceView   恢复。 GLSurfaceView客户端需要在调用onPause()时调用   活动恢复时,活动暂停和onResume()。这些电话   允许GLSurfaceView暂停和恢复渲染线程,以及   允许GLSurfaceView释放并重新创建OpenGL显示。

所以我应该在我的活动中做这样的事情:

public void onPause() {
    myGlSurfaceView.onPause();
}

public void onResume() {
    myGlSurfaceView.onResume();
}

我在我的代码中观察到,如果我不打电话给onPause()onResume(),那么按下主页按钮时上下文不会丢失,所以我可以在应用程序,然后回到我的游戏,一切正常。我看到的是,如果我使用后退按钮关闭游戏,那么当我再次打开它时屏幕是黑色的,但我可以改变后退按钮行为以完全关闭游戏并避免这个问题。

所以我的问题是:什么时候 OpenGL 上下文被破坏了?如果我不打电话给onPause()onResume(),我可以假设它永远不会被销毁吗?

修改

我定位的是Android 2.2,所以setPreserveEGLContextOnPause()不适合我。

2 个答案:

答案 0 :(得分:26)

只有在调用Actvity :: onPause()之后,OpenGL才会丢失,并且仅在这种情况下。请参阅setPreserveEGLContextOnPause文档:

  

是否实际保留EGL上下文取决于运行该程序的Android设备是否可以支持任意数量的EGL上下文。只能支持有限数量的EGL上下文的设备必须释放EGL上下文才能允许多个应用程序共享GPU。   [...] 当GLSurfaceView暂停时可以释放EGL上下文,并在GLSurfaceView恢复时重新创建。

编辑:文档中描述的情况适用于所有Android版本。无论您有权访问setPreserveEGLContextOnPause

在我看来,这是Android OGLES实现的一个主要缺点:你无法确定。

documentation本身含糊不清(EGL背景丢失注释):

  

在某些情况下,EGL渲染上下文将会丢失。这通常发生在设备在睡觉后醒来时

我注意到与Home和Back按钮相同的行为。呼叫并不完全相同(但不能准确记住它们)。

确保OpenGL上下文可用的唯一方法是在onSurfaceCreated中创建所有OpenGL资源

关于 setPreserveEGLContextOnPause 的说明。再一次,这个documentation comment演示了上下文破坏的“随机”行为:

  

如果设置为true,则在GLSurfaceView暂停时可以保留EGL上下文 。 [...]

答案 1 :(得分:1)

setPreserveEGLContextOnPause是一个选项,你只需要自己实现GlSurfaceView。

在这里看到我的回答类似的问题: Prevent onPause from trashing OpenGL Context