【发布时间】:2018-04-12 21:27:41
【问题描述】:
我正在使用 OpenGL 和 NDK (C++) 开发一个绘画应用程序,我必须编写自己的 EGL 上下文管理器。它应该以不同于标准 GLSurfaceView 的方式管理 EGLContext,具体来说,它应该能够在不同的 EGLSurfaces 之间切换,在 onPause() 之后保留 EGLContext,并在创建上下文之前检查是否有一些 EGL 扩展可用。在阅读了 EGL 官方文档、GLSurfaceView 的源代码和文档以及其他关于 EGL 的文章后,我仍然不清楚。
在 onPause() 之前初始化的 EGLDisplay 在 onPause() 之后是否会像 EGLContext 一样失效/丢失?
EGL 文档说明如下:
电源管理事件可以在应用程序运行时异步发生 跑步。当系统从电源管理事件返回时 EGLContext 将失效 ... 在电源管理事件之后,调用 eglSwapBuffers、eglCopyBuffers、 或 eglMakeCurrent 将通过返回 EGL_FALSE 来指示失败。这 如果发生电源管理事件,将返回错误 EGL_CONTEXT_LOST。 在检测到此错误时,应用程序必须销毁所有上下文(通过调用 eglDestroyContext 为每个上下文)。要继续呈现应用程序必须 重新创建它需要的任何上下文,然后恢复任何客户端 API 状态和 它希望使用的对象。
据此,只有 EGLContext 必须重新创建,但 GLSurfaceView 也会重新初始化 EGLDisplay。为什么?
如果 EGLDisplay 永远不会失效,只初始化一次并保存在全局变量中是否安全?我是否需要在进程终止之前调用 eglTerminate() 来释放这样的全局显示以防止任何泄漏?
【问题讨论】:
-
AnyEGLSurfaces that the application has created need not be destroyedfollowing a power management event, but their contents will be invalid.甚至 EGL 表面也存在,除了 EGLDisplay。