Android:OpenGL上下文何时被破坏?
在android上,Android:OpenGL上下文何时被破坏?,android,opengl-es,Android,Opengl Es,在android上,GLSurfaceView文档说明: 活动暂停时必须通知GLSURFACHEVIEW,并且 接着说。GLSURFACHEVIEW客户端需要在 活动暂停,并在活动恢复时返回onResume()。这些电话 允许GLSURFACHEVIEW暂停和恢复渲染线程,以及 允许GLSurfaceView释放并重新创建OpenGL显示 所以我应该在我的活动中这样做: public void onPause() { myGlSurfaceView.onPause(); } publi
GLSurfaceView
文档说明:
活动暂停时必须通知GLSURFACHEVIEW,并且
接着说。GLSURFACHEVIEW客户端需要在
活动暂停,并在活动恢复时返回onResume()。这些电话
允许GLSURFACHEVIEW暂停和恢复渲染线程,以及
允许GLSurfaceView释放并重新创建OpenGL显示
所以我应该在我的活动中这样做:
public void onPause() {
myGlSurfaceView.onPause();
}
public void onResume() {
myGlSurfaceView.onResume();
}
我在我的代码中观察到,如果我不调用onPause()
和onResume()
,当我按下home按钮时,上下文不会丢失,因此我可以在应用程序之间切换,然后返回游戏,一切都正常。我看到的是,如果我用后退按钮关闭游戏,那么当我再次打开它时,屏幕是黑色的,但是我可以改变后退按钮的行为来完全关闭游戏并避免这个问题
所以我的问题是:OpenGL上下文何时被破坏?如果我不调用onPause()
和onResume()
我能假设它永远不会被销毁吗
编辑:
我的目标是Android 2.2,因此
setPreserveEGLContextOnPause()
对我来说不是一个选项。只有在调用Activity::onPause()之后,并且只有在这种情况下,OpenGL才可能丢失。请参阅文档:
EGL上下文是否被实际保留取决于运行程序的Android设备是否支持任意数量的EGL上下文。只能支持有限数量EGL上下文的设备必须释放EGL上下文,以便允许多个应用程序共享GPU。
[…]当GLSURFACHEVIEW暂停时,[可以]释放EGL上下文,并在GLSURFACHEVIEW恢复时重新创建
编辑:文档中描述的情况在所有Android版本上都有效。无论您是否有权访问setPreserveEGLContextOnPause
在我看来,Android OGLES实现的一个主要缺点是:你不能确定
其本身是模糊的(EGL上下文丢失注释):
在某些情况下,EGL呈现上下文将丢失。这通常发生在设备睡眠后醒来时
我注意到“主页”和“返回”按钮的行为与您相同。电话并不完全相同(但记不清)
确保OpenGL上下文可用的唯一方法是在中创建所有OpenGL资源
关于设置保留EGLContextonPause的注意事项。这再次证明了上下文破坏的“随机”行为:
如果设置为true,则当GLSURFACHEVIEW暂停时,EGL上下文可能会被保留。[……]
setPreserveEGLContextOnPause是您的一个选项,您只需自己实现GlSurfaceView即可 请参见我对类似问题的回答:
我很想知道myGlSurfaceView.getPreserveEGLContextOnPause()的值。如果设置为true,则可以保留您的上下文。有关更多信息,请参阅。@RodHyde抱歉,我忘了说我的目标是Android 2.2。这是一个使用GLSurface进行绘图的代码。你有没有为Android 3.0之前的版本找到一个好的解决方案?我只能重建上下文并重新加载纹理,这导致长时间的空白屏幕加载或精灵弹出,看起来很糟糕。对不起,我忘了说我的目标是安卓2.2。我也在安卓2.2上工作。在这种情况下,setPreserveEGLContextOnPause不可用,但它不会改变OpenGL上下文丢失的方式……我仍然不清楚。因此,如果我在请求确认后不调用GLSurfaceView的onPause()并处理back键关闭应用程序,那么上下文将永远不会被破坏?或多或少:这就是Android(顺便说一下,还有iOS)的工作方式。如果您没有完全关闭应用程序,它将保留在内存中,以加速下一次启动并检索完全相同的状态。但是,如文档中所述,如果其他应用程序创建OpenGL上下文,Android可能会从您的应用程序中销毁该上下文。关于是否调用OnPause,文档说:GLSurfaceView客户端需要调用OnPause()。建议遵循这一点,否则您可能会由于操作系统版本或设备而产生意外结果。。。但当然,你也可以不打电话!使用GLSURFACHEVIEW实现在Adreno设备上会发生什么?