C++ 正确删除EGL Opengles 2.0
我编写了一个程序,在WINCE上创建一个窗口,并使用EGL创建绘图表面和上下文。当该程序退出时,我有以下清理例程:C++ 正确删除EGL Opengles 2.0,c++,memory,opengl-es-2.0,egl,C++,Memory,Opengl Es 2.0,Egl,我编写了一个程序,在WINCE上创建一个窗口,并使用EGL创建绘图表面和上下文。当该程序退出时,我有以下清理例程: eglMakeCurrent(m_eglDisplay,EGL_NO_SURFACE,EGL_NO_SURFACE,m_eglContext); eglDestroyContext(m_eglDisplay,m_eglContext); glDeleteProgram(m_eglProgramObject); glReleaseShaderCompiler(); d
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);
删除创建的任何其他总账资源。例如纹理、帧缓冲区、顶点缓冲区、像素缓冲区等
在此之后,您必须使用空曲面和上下文执行eglmakecurrent。这将取消EGLContext与当前线程(TLS)的关联
在此之后,您必须释放所有创建的EGLResource:
eglDestroySurface(m_eglDisplay,m_eglSurface);
eglDestroyContext(m_eglDisplay,m_eglContext);
最后,请执行以下操作:
eglTerminate(m_eglDisplay);
如果您还创建了任何平台窗口对象,例如X11的XDisplay、Wayland的wl_display或Android的AWindow。你也必须删除/销毁它
我希望它能有所帮助。当程序退出时,正确的实现应该清理所有与OpenGL相关的资源。也就是说,你也在破坏表面吗?如果你还没有这么做,也许值得一试。此外,上面的序列无效。只要您仍然拥有有效的当前上下文,就需要进行
glDelete*()
调用。@RetoKoradi感谢您的建议。我已经查看了EGL和Opengles 2.0的备忘单,并对代码进行了修改,以包含在解构器中:glDeleteProgram(m_eglProgramObject);glReleaseShaderCompiler();eglTerminate(m_eglDisplay);eglMakeCurrent(m_eglDisplay、EGL_NO_SURFACE、EGL_NO_SURFACE、EGL_NO_CONTEXT);eglDestroySurface(m_eglDisplay,m_eglSurface);eglDestroyContext(m_eglDisplay,m_eglContext);eglReleaseThread()代码>但同样的结果也会发生。最终,EGL的内存分配出现了问题:/请您指出glDelete调用的正确顺序应该是什么?谢谢您的建议!想想看,当我创建窗口时,我并没有释放设备上下文。我要试试。
eglTerminate(m_eglDisplay);