1

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

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

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

只是想确保我错过了什么

4

1 回答 1

1

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

每个上下文都维护自己的一组绑定纹理,因此如果您在上下文AB中绑定纹理1,则删除上下文A直到您也删除(或取消绑定)上下文B后才能释放纹理。此行为也适用于调用。glDeleteTextures (...)

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

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

于 2014-06-19T20:57:57.537 回答