我正在使用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()来释放此类全局显示以防止任何泄漏?
答案 0 :(得分:1)
我可以告诉您,我为GLSurfaceView编写了一个EGLContextFactory作为单例,在其中创建一个基础上下文,然后从中派生其他上下文,以便进行多线程渲染并共享纹理。我只得到一次EGLDisplay,并在应用程序的整个生命周期中重用了它,没有任何问题。
此外,如果您查看EGLDisplay的mHandle
,您可能会注意到它始终是相同的(1)。