Android 上的 EGL 上下文管理
EGL context management on Android
我正在使用 OpenGL 和 NDK (C++) 开发一个绘画应用程序,我必须编写自己的 EGL 上下文管理器。它应该以不同于标准 GLSurfaceView 的方式管理 EGLContext,具体来说,它应该能够在不同的 EGLSurfaces 之间切换,在 onPause() 之后保留 EGLContext,并在创建上下文之前检查是否有一些 EGL 扩展可用。看了EGL官方文档,GLSurfaceView的源码和文档,还有其他关于EGL的文章,还是有些不明白。
在 onPause() 之前初始化的 EGLDisplay 是否会在 onPause() 之后像 EGLContext 一样失效/丢失?
EGL 文档说明如下:
Power management events can occur asynchronously while an application is
running. When the system returns from the power management event the
EGLContext will be invalidated
...
Following a power management event, calls to eglSwapBuffers, eglCopyBuffers,
or eglMakeCurrent will indicate failure by returning EGL_FALSE. The
error EGL_CONTEXT_LOST will be returned if a power management event has occurred.
On detection of this error, the application must destroy all contexts (by calling
eglDestroyContext for each context). To continue rendering the application must
recreate any contexts it requires, and subsequently restore any client API state and
objects it wishes to use.
据此,只有EGLContext 必须重新创建,但GLSurfaceView 也会重新初始化EGLDisplay。为什么?
如果 EGLDisplay 永远不会失效,只初始化一次并保存在全局变量中是否安全?我是否需要在进程终止之前调用 eglTerminate() 来释放此类全局显示以防止任何泄漏?
我可以告诉你我已经编写了一个 EGLContextFactory 作为 GLSurfaceView 的单例,我在其中创建了一个基础上下文,然后从中派生其他上下文,以便进行多线程渲染和共享纹理。我只获得一次 EGLDisplay 并在整个应用程序的生命周期中重复使用它,没有任何问题。
此外,如果您查看 EGLDisplay 的 mHandle
,您可能会注意到它始终相同 (1)。
我正在使用 OpenGL 和 NDK (C++) 开发一个绘画应用程序,我必须编写自己的 EGL 上下文管理器。它应该以不同于标准 GLSurfaceView 的方式管理 EGLContext,具体来说,它应该能够在不同的 EGLSurfaces 之间切换,在 onPause() 之后保留 EGLContext,并在创建上下文之前检查是否有一些 EGL 扩展可用。看了EGL官方文档,GLSurfaceView的源码和文档,还有其他关于EGL的文章,还是有些不明白。
在 onPause() 之前初始化的 EGLDisplay 是否会在 onPause() 之后像 EGLContext 一样失效/丢失?
EGL 文档说明如下:
Power management events can occur asynchronously while an application is running. When the system returns from the power management event the EGLContext will be invalidated ... Following a power management event, calls to eglSwapBuffers, eglCopyBuffers, or eglMakeCurrent will indicate failure by returning EGL_FALSE. The error EGL_CONTEXT_LOST will be returned if a power management event has occurred. On detection of this error, the application must destroy all contexts (by calling eglDestroyContext for each context). To continue rendering the application must recreate any contexts it requires, and subsequently restore any client API state and objects it wishes to use.
据此,只有EGLContext 必须重新创建,但GLSurfaceView 也会重新初始化EGLDisplay。为什么?
如果 EGLDisplay 永远不会失效,只初始化一次并保存在全局变量中是否安全?我是否需要在进程终止之前调用 eglTerminate() 来释放此类全局显示以防止任何泄漏?
我可以告诉你我已经编写了一个 EGLContextFactory 作为 GLSurfaceView 的单例,我在其中创建了一个基础上下文,然后从中派生其他上下文,以便进行多线程渲染和共享纹理。我只获得一次 EGLDisplay 并在整个应用程序的生命周期中重复使用它,没有任何问题。
此外,如果您查看 EGLDisplay 的 mHandle
,您可能会注意到它始终相同 (1)。