Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:OpenGL上下文何时被破坏?_Android_Opengl Es - Fatal编程技术网

Android:OpenGL上下文何时被破坏?

Android:OpenGL上下文何时被破坏?,android,opengl-es,Android,Opengl Es,在android上,GLSurfaceView文档说明: 活动暂停时必须通知GLSURFACHEVIEW,并且 接着说。GLSURFACHEVIEW客户端需要在 活动暂停,并在活动恢复时返回onResume()。这些电话 允许GLSURFACHEVIEW暂停和恢复渲染线程,以及 允许GLSurfaceView释放并重新创建OpenGL显示 所以我应该在我的活动中这样做: public void onPause() { myGlSurfaceView.onPause(); } publi

在android上,
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设备上会发生什么?