【问题标题】:Deallocating OpenGL context created by QGLWidget释放由 QGLWidget 创建的 OpenGL 上下文
【发布时间】:2023-03-26 21:34:01
【问题描述】:

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

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

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

只是想确保我错过了什么

【问题讨论】:

    标签: qt opengl qglwidget openglcontext


    【解决方案1】:

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

    每个上下文都维护自己的一组绑定纹理,因此如果您在上下文AB中绑定纹理1,则删除上下文A 除非您同时删除(或解除绑定)上下文 B,否则无法释放纹理。此行为也适用于调用glDeleteTextures (...)

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

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

    【讨论】:

    • 我决定继续使用 glDeleteTextures。我很确定我只使用 1 个上下文,因为我有 1 个 QGLWidget 和 10 个共享小部件。所以希望只调用一次 glDeleteTextures 就可以了。
    • 共享小部件只是意味着属于您创建的小部件的上下文与其他一些小部件的上下文共享资源。与正常行为相反,每个小部件的上下文是完全独立的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 2014-08-15
    • 2013-02-19
    • 2020-08-29
    • 2013-08-10
    • 1970-01-01
    相关资源
    最近更新 更多