1

QGLWidget を作成し、glGenTextures、glTex2DImage などを使用して独自のテクスチャを割り当てた場合、ウィジェットを削除すると、そのテクスチャ データはすべてクリーンアップされますか? (また、共有ウィジェットも削除されます)。

デストラクタのソースを調べたところ、コンテキストを削除しているように見えます。これにより、そのコンテキストで生成したテクスチャもクリーンアップされると思います

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

何かが足りない場合に備えて確認したいだけです

4

1 に答える 1

1

いいえ、テクスチャ ストレージは、それを使用するオブジェクトがそれを共有するコンテキストのいずれにもバインドされていない場合にのみ解放されます。また、1 つのコンテキストが破棄されたからといって暗黙的に解放されるわけではありません。すべての共有コンテキスト間で同じオブジェクトの名前空間を共有しているため、これが発生する可能性はありません (共有グループ内のすべてのコンテキストを破棄する必要があります)。

各コンテキストは、バインドされたテクスチャの独自のセットを保持するため、テクスチャ1をコンテキストAおよびBにバインドした場合、コンテキストAを削除すると、コンテキストBも削除 (またはアンバインド) するまでテクスチャを解放できません。この動作は呼び出しにも適用さglDeleteTextures (...)れます。

その関数は、現在の(呼び出し元の) コンテキストから渡されたテクスチャを暗黙的にバインド解除しますが、他のコンテキストでバインド解除されるまで、メモリを解放することはできません。すぐに行われる唯一のことは、テクスチャ名がすぐに再利用可能になり、その後の への呼び出しによって返される可能性があることglGenTextures (...)です。

簡単に言えば、あなたの場合、メモリは最終的に解放されます(すべてのコンテキストを破棄すると主張しています)。最初のコンテキストを破棄してもすぐに解放されるとは限りません。上記の他の条件を最初に満たす必要があります。

于 2014-06-19T20:57:57.537 に答える