防止EGLContext在进入后台时被销毁

时间:2015-03-14 13:20:55

标签: android opengl-es android-ndk glsurfaceview onpause

当用户最小化它时,我的Android(OpenGL ES 2.0)游戏需要暂停,而不会破坏屏幕上已经绘制的内容。最初它使用的是NativeActivity和纯C ++,但看起来它不可能存在。我已经重写了它,它现在是Java生成自定义GLSurfaceView和游戏逻辑+渲染是在C ++中。我在创建表面时添加了 setPreserveEGLContextOnPause(true)

用户点击主页按钮后的缺陷是:

  1. onPause 通过JNI将 nativeOnPause 发送到C ++代码
  2. C ++代码设置暂停变量,阻止更新和呈现
  3. 这没关系。在我们回到app:

    之后
    1. onResume 调用 nativeOnResume
    2. nativeOnResume调用EGL方法获取当前上下文,显示和表面并将其传递给游戏管理器。
    3. 现在已激活更新和渲染
    4. 我们收到很少的 EGL_BAD_SURFACE 消息,最后崩溃 eglMakeCurrent
    5. 问题是:我们是否应该以任何方式使用当前上下文重新创建EGLSurface和EGLDisplay,或者获取当前曲面和显示是否合适?

      我还注意到,当我们回到app时,会调用 onResume ,但不会调用 onSurfaceChanged onSurfaceCreated

      有关如何在> 4.0设备上解决该问题的任何建议吗?

1 个答案:

答案 0 :(得分:2)

如果要控制EGL上下文生命周期,请不要使用GLSurfaceView。

GLSurfaceView类为您处理EGL上下文,并且相当积极地放弃它。 setPreserveEGLContextOnPause()电话可能无法满足你的需求。如果切换到SurfaceView,您将完全控制EGL上下文生命周期,但这是一把双刃剑,因为您现在需要完全管理EGL上下文。

您可以在Grafika中找到使用GLES和SurfaceView的各种示例。 “hardware scaler exerciser”活动是一个合理的例子。

该活动还演示了一种Activity生命周期管理方法。有关Activity和SurfaceView之间关系的讨论,包括您不总是看到surfaceChanged()surfaceCreated()的原因,可以在图形架构文档中找到in an appendix

说了这么多,在应用程序处于非活动状态时保持EGL上下文和所有相关资源是一种不好的做法。当用户暂停您的应用时,应释放这些资源,以便其他应用具有该设备的全部功能。