【问题标题】:Android: When is OpenGL context destroyed?Android:OpenGL上下文何时销毁?
【发布时间】:2012-06-16 23:42:25
【问题描述】:

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

【问题讨论】:

  • 我很想知道 myGlSurfaceView.getPreserveEGLContextOnPause() 的值。如果将其设置为 true,那么您的上下文可能会被保留。请参阅developer.android.com/reference/android/opengl/… 了解更多信息。
  • @RodHyde 抱歉,我忘了说我的目标是 Android 2.2
  • 这里是使用 GLSurface 进行绘图的代码。 code.google.com/p/andengine/source/browse/src/org/anddev/…
  • 您找到适用于 Android 3.0 之前的好的解决方案了吗?我只能重建上下文并重新加载纹理,这会导致长时间的空白屏幕加载或弹出看起来很糟糕的精灵。

标签: android opengl-es


【解决方案1】:

只有在调用了 Actvity::onPause() 之后,OpenGL 才会丢失,而且只有在这种情况下。请参阅setPreserveEGLContextOnPause 文档:

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

编辑:文档中描述的情况适用于所有 Android 版本。不管你是否可以访问setPreserveEGLContextOnPause

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

documentation 本身是模糊的(EGL Context Lost note):

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

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

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

关于 setPreserveEGLContextOnPause 的注意事项。再一次,这个documentation comment 演示了上下文破坏的“随机”行为:

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

【讨论】:

  • 抱歉,我忘了说我的目标是 Android 2.2
  • 我也在 Android 2.2 上工作。在这种情况下,setPreserveEGLContextOnPause 不可用,但它不会改变 OpenGL 上下文丢失的方式...
  • 我还不清楚。那么,如果我在请求确认后不调用 GLSurfaceView 的 onPause() 并处理返回键关闭应用程序,那么上下文将永远不会被破坏?
  • 或多或少:Android(顺便说一下iOS)的工作方式。如果您没有完全关闭您的应用程序,它会保留在内存中以加快下次启动并检索完全相同的状态。但是,如文档中所述,如果其他应用程序创建 OpenGL 上下文,Android 可能会从您的应用程序中销毁该上下文。关于是否调用 OnPause,文档说:GLSurfaceView 客户端需要调用 onPause()。建议遵循,否则给定操作系统版本或设备可能会出现意外结果...但是当然,您可以随意不调用它!
【解决方案2】:

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

在此处查看我对类似问题的回答: Prevent onPause from trashing OpenGL Context

【讨论】:

  • 使用您的 GlSurfaceView 实现的 Adreno 设备会发生什么?
猜你喜欢
  • 2014-08-15
  • 2020-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-05
  • 1970-01-01
  • 2011-10-09
  • 1970-01-01
相关资源
最近更新 更多