2 に答える
バズキルではありませんが、頂点配列オブジェクトなどのコンテナ オブジェクトは、この議論を非常に複雑にします。
通常、バッファ オブジェクトを削除すると、メモリを再利用できる 2 つの重要なことが起こります。
- その名前 (
GLuint
ID) はすぐに再利用できるように解放されます - オブジェクトは現在アクティブなコンテキストからバインド解除されています
遵守する必要がある隠れた警告があります。
- どのコンテキストでもオブジェクトへの参照がなくなるまで、データ ストアは実際には解放されません。
頂点配列オブジェクトにバインドされている頂点バッファー オブジェクトを削除し、その頂点配列オブジェクトが現在バインドされていない場合、箇条書き 2 で説明した動作は発生しません。名前は解放されますが、VAO は引き続き名前 (現在は無効) とデータ ストア (存在し続けます) の両方を参照します。バッファ オブジェクトのメモリは、この頂点配列オブジェクトが削除されるか、元のバッファ オブジェクトを参照しないようにバインディングが変更されるまで、再利用されません。
上記のより信頼できる説明については、OpenGL 4.4 コア仕様のセクション 5.1.2およびセクション 5.1.3を読むことをお勧めします。以下に、両方の最も関連性の高い部分をリストします。
5.1.2 削除されたオブジェクトの自動バインド解除
バッファー、テクスチャ、またはレンダーバッファー オブジェクトが削除されると、現在のコンテキストでバインドされているすべてのバインド ポイントからバインド解除され、現在のコンテキストにバインドされているコンテナー オブジェクトのすべての添付ファイルから切り離されます (DeleteBuffers、DeleteTextures で説明)。 、および DeleteRenderbuffers です。オブジェクト バインディングが他の関連する状態 (BindBufferRange のバッファー範囲、FramebufferTexture または BindImageTexture の選択されたレベルおよびレイヤー情報など) で確立された場合、その状態は自動バインド解除の影響を受けません。他のコンテキストのバインド ポイントは影響を受けません。次のセクションで説明するように、コンテキストにバインドされていない頂点配列オブジェクトにアタッチされたバッファーの削除など、バインドされていないコンテナー オブジェクトへのアタッチメントは影響を受けず、削除されたオブジェクトの参照として機能し続けます。
5.1.3 削除されたオブジェクトとオブジェクト名のライフタイム
[...]コンテナー オブジェクトのアタッチ ポイント、コンテキスト バインディング ポイント、またはビューからのオブジェクトへのすべての参照が削除されるまで、削除されたオブジェクトを裏付ける基になるストレージは GL によって再利用されません。
注:この動作は、OpenGL のすべてのコンテナー オブジェクトに適用されます。リソースへのすべての参照が削除されるまで、メモリは再利用されません。参照を削除するために必要な条件 ( 5.1.2を参照) を理解することは、長期的には役に立ちます。
glDeleteBuffers
選択したバッファを削除と割り当て解除のためにマークします。これは、OpenGL の一部がバッファのデータを内部的に必要としなくなるとすぐに実行されます。すべての実際的な手段glDeleteBuffers
として、バッファを解放します。