Освобождение контекста OpenGL, созданного QGLWidget

Если я создам QGLWidget, а затем выделю свои собственные текстуры, используя что-то вроде glGenTextures, glTex2DImage и т. д., все эти данные текстуры будут очищены при удалении виджета? (Кроме того, у меня также будут общие виджеты, которые тоже будут удалены).

Я посмотрел на источник деструктора, и похоже, что он удаляет контекст, который, как я предполагаю, также очистит все текстуры, которые я сгенерировал с этим контекстом.

https://qt.gitorious.org/qt/qt/source/ca5b49a2ec0ee9d7030b8d03b561717addd3441f%3asrc/opengl/qgl.cpp#L3409

Просто хочу убедиться, что я что-то упустил


person Bobby Pardridge    schedule 19.06.2014    source источник


Ответы (1)


Нет, хранилище текстур будет освобождено только в том случае, если объект, который его использует, не привязан ни к одному из контекстов, которые его используют. Более того, он не освобождается неявно только потому, что 1 контекст уничтожен. Вы используете одно и то же пространство имен объектов для всех ваших общих контекстов, поэтому этого нельзя допустить (все контексты в общей группе должны быть уничтожены).

Каждый контекст поддерживает свой собственный набор связанных текстур, поэтому, если вы привязываете текстуру 1 к контексту A и B, затем удаляете контекст A текстура не может быть освобождена, пока вы также не удалите (или не отвяжете ее от) контекст B. Это поведение применимо и к вызову glDeleteTextures (...).

Эта функция будет неявно отвязывать текстуру (текстуры), которую вы передаете ей, из текущего (вызывающего) контекста, но пока она не будет отвязана в каком-либо другом контексте, память не может быть освобождена. Единственное, что произойдет немедленно, это то, что имя текстуры сразу станет повторно используемым и может быть возвращено последующим вызовом glGenTextures (...).

Короче говоря, в вашем случае память в конечном итоге будет освобождена (вы утверждаете, что собираетесь уничтожить все контексты). Просто он не обязательно сразу освободится, когда вы уничтожите свой первый контекст — сначала должны быть выполнены другие условия, описанные выше.

person Andon M. Coleman    schedule 19.06.2014
comment
Я решил просто пойти дальше и использовать glDeleteTextures. Я почти уверен, что использую только 1 контекст, так как у меня есть 1 QGLWidget и 10 общих виджетов. Так что, надеюсь, достаточно одного вызова glDeleteTextures. - person Bobby Pardridge; 20.06.2014
comment
Общий виджет просто означает, что контекст, принадлежащий виджету, который вы создаете, использует общие ресурсы с контекстом другого виджета. В отличие от обычного поведения, когда контекст каждого виджета полностью отделен. - person Andon M. Coleman; 20.06.2014