如果我创建一个QGLWidget,然后我使用glGenTextures, glTex2DImage等分配我自己的纹理,当我删除小部件时,所有的纹理数据都会得到清理吗?(另外,我也会有共享的小部件,也会被删除)。
我查看了析构函数的源代码,它看起来像是在删除上下文,我认为这也会清除我用该上下文生成的任何纹理
https://qt.gitorious.org/qt/qt/source/ca5b49a2ec0ee9d7030b8d03b561717addd3441f src/opengl qgl.cpp # L3409
只是想确保万一我错过了什么
不,只有当使用它的对象没有绑定在任何共享它的上下文中时,纹理存储才会被释放。此外,它不会因为一个上下文被销毁而隐式释放。在所有共享的上下文之间共享相同的对象名称空间,因此不允许发生这种情况(共享组中的所有上下文都必须被销毁)。
每个上下文都维护自己的绑定纹理集,所以如果你在context A和B中绑定了纹理1,那么删除context A这个纹理不能被释放,直到你也删除(或从)context B。此行为也适用于调用glDeleteTextures (...)
。
该函数将隐式地解除从当前(调用)上下文中传递的纹理的绑定,但是直到它在任何其他上下文中解除绑定之前,内存不允许被释放。唯一会立即发生的事情是纹理名称可以立即重用,并且可以通过随后对glGenTextures (...)
的调用返回。
长话短说,在您的情况下,内存最终将被释放(您声称您将销毁所有上下文)。当您销毁第一个上下文时,它不一定会立即被释放——必须首先满足上面描述的其他条件。