我正在使用OpenGL和NDK(C ++)开发绘画应用程序,我必须编写自己的EGL上下文管理器。它应该以与标准GLSurfaceView不同的方式管理EGLContext,具体来说,它应该能够在不同的EGLSurface之间切换,在onPause()之后保留EGLContext并检查在创建上下文之前是否有一些EGL扩展可用。在阅读官方EGL文档后,GLSurfaceView的源代码和文档以及其他有关EGL的文章对我来说仍然不清楚。
EGLDisplay可以在onPause()之前初始化,在onPause()之后像EGLContext一样失效/丢失吗?
EGL文档声明如下:
电源管理事件可以在应用程序运行时异步发生。当系统从电源管理事件返回时,EGLContext将无效...在电源管理事件之后,对eglSwapBuffers,eglCopyBuffers或eglMakeCurrent的调用将通过返回EGL_FALSE指示失败。如果发生电源管理事件,将返回错误EGL_CONTEXT_LOST。检测到此错误时,应用程序必须销毁所有上下文(通过为每个上下文调用eglDestroyContext)。要继续呈现应用程序,必须重新创建它需要的任何上下文,然后恢复它希望使用的任何客户端API状态和对象。
根据这一点,只有EGLContext必须重新创建,但GLSurfaceView也重新初始化EGLDisplay。为什么?
如果EGLDisplay永远不会失效,那么只将它初始化一次并保存在全局变量中是否安全?我是否需要在进程终止之前调用eglTerminate()来释放此类全局显示以防止任何泄漏?
我可以告诉你我已经编写了一个EGLContextFactory作为GLSurfaceView的单例,我在其中创建了一个基本上下文,然后从中导出其他上下文,以便进行多线程渲染和共享纹理。我只获得EGLDisplay一次并在整个应用程序的生命周期中重复使用它而没有任何问题。
此外,如果你看一下EGLDisplay的mHandle
,你可能会注意到它总是一样的(1)。