「メモリが豊富だから削除しなくていい」というアプローチはまずいし、「メモリが豊富だから絶対にメモリエラーが出ない」というアプローチには欠陥があります。
OpenGL のメモリ管理は、技術的な理由 (上記の t.niese のコメントを参照) とイデオロギー上の理由 (「知る必要はない、知りたくない」) の両方から、あいまいです。ベンダー拡張 (ATI_meminfo など) は存在しますが、いくつかの非正式な番号 (次のミリ秒を変更できる限り非正式であり、フラグメンテーションなどの影響を考慮していません) をクエリできます。
一般に、ほとんどの場合、GPU メモリよりも多くのメモリを使用できるという想定は正しいです。
ただし、通常、使用可能なメモリをすべて使用できるわけではありません。多くの場合、ドライバーが割り当て、ロック、および DMA との間で割り当て、ロック、および DMA を行うことができるメモリ領域 (および領域の大きさ) の制約により、「利用可能なすべての RAM」をはるかに下回る制限があります。また、通常は GPU に収まるよりも多くのメモリを使用できますが (排他的に使用した場合でも)、これは、不注意な割り当てが失敗する可能性があり、最終的に失敗しないという意味ではありません。
必ずというわけではありませんが、通常は、GPU メモリと同じくらい多くのシステム メモリも消費します (知らないうちに、ドライバーは密かにそれを行っています)。ドライバーは必要に応じてリソースをスワップインおよびスワップアウトするため、コピーを維持する必要があります。場合によっては、2 つまたは 3 つのコピーを保持する必要があります (ストリーミング時や ARB_copy_buffer 操作など)。バッファ オブジェクトのマッピングが、特別に割り当てられたブロック内の別のコピーである場合もあれば、ドライバのメモリに直接書き込むことが許可されている場合もあります。一方、PCIe 2.0 (および PCIe 3.0 はさらに高速) は、メイン メモリから頂点をストリーミングするのに十分な速さであるため、厳密には GPU メモリは必要ありません (小さなバッファーを除いて)。一部のドライバーは、動的ジオメトリをシステム メモリからすぐにストリーミングします。
一部の GPU には、別個のシステムと GPU メモリさえありません (Intel Sandy Bridge または AMD Fusion)。
また、オブジェクトを削除しても、必ずしもそれらが削除されるとは限らないことに注意してください (少なくともすぐには削除されません)。通常、ごくわずかな例外を除いて、OpenGL オブジェクトの削除は一時的な削除に過ぎず、それ以上オブジェクトを参照することはできません。ドライバは、必要な限りオブジェクトを有効に保ちます。
一方で、不要になったものは本当に削除するべきであり、早期に削除する必要があります。たとえば、シェーダーをプログラム オブジェクトにアタッチした直後にシェーダーを削除する必要があります。これにより、リソースがリークしないことが保証され、動作が保証されます。ストリーミング時に使用中の頂点またはピクセル バッファーを削除して再指定する (呼び出しによることglBufferData(... NULL);
はよく知られている慣用句です。これはオブジェクトのビューにのみ影響し、ドライバーは古いオブジェクトを並行して使用し続けることができます。必要に応じて。