Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 正确删除EGL Opengles 2.0_C++_Memory_Opengl Es 2.0_Egl - Fatal编程技术网

C++ 正确删除EGL Opengles 2.0

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

我编写了一个程序,在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);
删除创建的任何其他总账资源。例如纹理、帧缓冲区、顶点缓冲区、像素缓冲区等

在此之后,您必须使用空曲面和上下文执行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);