15

在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()不是我的选择。

4

2 回答 2

27

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

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

编辑:文档中描述的情况在所有 Android 版本上都有效。不管你是否有权访问setPreserveEGLContextOnPause

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

文档本身含糊不清(EGL Context Lost note):

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

我注意到关于 Home 和 Back 按钮的行为与您相同。通话并不完全相同(但无法准确记住它们)。

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

注意setPreserveEGLContextOnPause。再一次,此文档注释 演示了上下文破坏的“随机”行为:

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

于 2012-06-19T13:54:07.603 回答
1

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

在此处查看我对类似问题的回答: 防止 onPause 破坏 OpenGL 上下文

于 2012-06-23T08:18:11.303 回答