在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()
不适合我。
答案 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