Android:OpenGL上下文何时被销毁



在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()对我来说不是一个选择。

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

EGL 上下文

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

编辑:文档中描述的情况在所有Android版本上都有效。无论您可以访问setPreserveEGLContextOnPause

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

文档本身含糊不清(EGL 上下文丢失注释):

在某些情况下,EGL 呈现上下文将丢失。这通常发生在设备在进入睡眠状态后唤醒时

我注意到与您关于"主页"和"后退"按钮的行为相同。通话并不完全相同(但不能准确记住它们)。

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

关于 setPreserveEGLContextOnPause 的注意事项。再一次,这个文档注释演示了上下文销毁的"随机"行为:

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

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

请参阅我对类似问题的回答:防止暂停破坏 OpenGL 上下文

最新更新