我编写了一个程序,该程序在 WINCE 上创建一个窗口并使用 EGL 创建绘图表面和上下文。当该程序退出时,我有以下清理例程:
eglMakeCurrent(m_eglDisplay,EGL_NO_SURFACE,EGL_NO_SURFACE,m_eglContext);
eglDestroyContext(m_eglDisplay,m_eglContext);
glDeleteProgram(m_eglProgramObject);
glReleaseShaderCompiler();
delete m_eglDisplay;
delete m_eglSurface;
delete m_eglContext;
delete m_eglConfig;
如果我不重新启动目标系统,最终该程序的打开和关闭会导致以下行失败:
m_eglContext = eglCreateContext(m_eglDisplay,m_eglConfig,EGL_NO_CONTEXT,arrContextAttrib);
EGL 错误 12291 显然意味着 EGL_BAD_ALLOC。我假设有一些与 EGL 相关的内存在每次程序退出时都没有被正确删除,但不知道这可能是什么。有什么建议么?
最佳答案
要正确释放您的 EGL 和 OpenGL 2.0 资源,您必须执行以下操作;
glDeleteProgram(m_eglProgramObject);
删除创建的任何其他 GL 资源。例如纹理、帧缓冲区、顶点缓冲区、像素缓冲区等
在此之后,您必须使用空表面和上下文执行eglmakecurrent。这将解除您的 EGLContext 与当前线程 (TLS) 的关联
eglMakeCurrent(m_eglDisplay,EGL_NO_SURFACE,EGL_NO_SURFACE, EGL_NO_CONTEXT );
此后您必须释放所有创建的 EGLResources:
eglDestroySurface(m_eglDisplay,m_eglSurface);
eglDestroyContext(m_eglDisplay,m_eglContext);
最后执行eglTerminate:
eglTerminate(m_eglDisplay);
如果您还创建了任何平台窗口对象,例如 X11 的 XDisplay、Wayland 的 wl_display 或 Android 的 AWindow。您还必须删除/销毁它。
希望对您有所帮助。
关于c++ - 正确删除EGL Opengles 2.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29284904/