【问题标题】:EGL context management on AndroidAndroid 上的 EGL 上下文管理
【发布时间】: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。

标签: android opengl-es egl


【解决方案1】:

我可以告诉你,我已经编写了一个 EGLContextFactory 作为 GLSurfaceView 的单例,我在其中创建了一个基本上下文,然后从中派生其他上下文,以便进行多线程渲染和共享纹理。我只得到 EGLDisplay 一次,并在应用程序的整个生命周期中毫无问题地重复使用它。

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

【讨论】:

    猜你喜欢
    • 2016-07-26
    • 2018-01-08
    • 2015-11-05
    • 2011-05-08
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    相关资源
    最近更新 更多