c++ - 正确删除EGL Opengles 2.0

标签 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();

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/

相关文章:

c++ - GDB输出的解释

c++ - 在进入 main 函数之前,你能用 C++ 打印任何东西吗?

c++ - 使用自定义 header 进行 ffplay 编译

java - 运行缓慢,内存占用高

ios - 从 libBacktraceRecording.dylib 连续分配 500kb

ios - 独立渲染到多采样缓冲区和解析帧缓冲区

c++ - C++中的 float 四舍五入到小数点后一位

python - 减少 multiprocessing.Pool.starmap() 列表的内存大小

Android opengl es shader编译报错

ios - 我应该如何将 OpenGL 模型 View 转换为 CATransform3D?