Android上的EGL上下文管理

时间:2018-04-12 21:27:42

标签: android opengl-es egl

我正在使用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()来释放此类全局显示以防止任何泄漏?

1 个答案:

答案 0 :(得分:1)

我可以告诉您,我为GLSurfaceView编写了一个EGLContextFactory作为单例,在其中创建一个基础上下文,然后从中派生其他上下文,以便进行多线程渲染并共享纹理。我只得到一次EGLDisplay,并在应用程序的整个生命周期中重用了它,没有任何问题。

此外,如果您查看EGLDisplay的mHandle,您可能会注意到它始终是相同的(1)。