释放由QGLWidget创建的OpenGL上下文

时间:2014-06-19 19:08:21

标签: qt opengl qglwidget openglcontext

如果我创建了一个QGLWidget,然后使用glGenTextures,glTex2DImage等分配我自己的纹理,那么当我删除小部件时,所有纹理数据都会被清理掉吗? (另外,我也会有共享的小部件,也会被删除)。

我查看了析构函数的源代码,看起来它正在删除上下文,我假设它也会清理我用该上下文生成的任何纹理

https://qt.gitorious.org/qt/qt/source/ca5b49a2ec0ee9d7030b8d03b561717addd3441f:src/opengl/qgl.cpp#L3409

只是想确保我错过了什么

1 个答案:

答案 0 :(得分:1)

不,仅当使用它的对象未绑定到共享它的上下文的 任何 时,纹理存储才会被释放。而且,它不会因为1个上下文被破坏而被隐式释放。您在所有共享上下文之间共享相同的对象名称空间,因此无法允许发生(共享组中的所有上下文都必须被销毁)。

每个上下文都维护着自己的绑定纹理集,因此如果在上下文 A B 中绑定纹理 1 ,则删除上下文< strong> A 在您还删除(或取消绑定)上下文 B 之前,无法释放纹理。此行为也适用于调用glDeleteTextures (...)

该函数将隐式解除从当前(调用)上下文传递的纹理的绑定,但在任何其他上下文中未绑定之前,不允许释放内存。唯一会立即发生的事情是纹理名称可以立即重复使用,并且可以通过后续调用glGenTextures (...)返回。

长话短说,在你的情况下,记忆最终将被释放(你声称你将要破坏 所有 的上下文)。当您破坏第一个上下文时,它不一定会被立即释放 - 必须首先满足上述其他条件。