当用户最小化它时,我的Android(OpenGL ES 2.0)游戏需要暂停,而不会破坏屏幕上已经绘制的内容。最初它使用的是NativeActivity和纯C ++,但看起来它不可能存在。我已经重写了它,它现在是Java生成自定义GLSurfaceView和游戏逻辑+渲染是在C ++中。我在创建表面时添加了 setPreserveEGLContextOnPause(true)。
用户点击主页按钮后的缺陷是:
这没关系。在我们回到app:
之后问题是:我们是否应该以任何方式使用当前上下文重新创建EGLSurface和EGLDisplay,或者获取当前曲面和显示是否合适?
我还注意到,当我们回到app时,会调用 onResume ,但不会调用 onSurfaceChanged 或 onSurfaceCreated 。
有关如何在> 4.0设备上解决该问题的任何建议吗?
答案 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上下文和所有相关资源是一种不好的做法。当用户暂停您的应用时,应释放这些资源,以便其他应用具有该设备的全部功能。