glDelete *関数を使用してすべてのDisplayList、Textures、(Geometry-)Shadersなどを手動でクリーンアップする必要がありますか、それともプログラムが終了/クラッシュしたときにGPU memが自動的に解放されますか?
注:GPU memは、CPUメモリではなく、専用のグラフィックカード上の専用メモリを指します。
glDelete *関数を使用してすべてのDisplayList、Textures、(Geometry-)Shadersなどを手動でクリーンアップする必要がありますか、それともプログラムが終了/クラッシュしたときにGPU memが自動的に解放されますか?
注:GPU memは、CPUメモリではなく、専用のグラフィックカード上の専用メモリを指します。
コンテキストを解放します。他のすべてはコンテキストに対してローカルであり (表示リストの共有を有効にしない限り)、コンテキストと共に消えます。
他の人が述べたように、OSは(ドライバーリソースマネージャーと連携して)リソースを解放する必要があります。それがOSの目的です。これはOpenGLとは何の関係もありませんが、正常に動作するOSとそれに関連するドライバーの憲章の一部であることに注意してください。OSは、すべてのシステムリソースを処理するためにあります。OpenGLのものはそれらのサブセットにすぎず、たとえばファイルハンドルと同じです。具体的には、気になるOSを指定する必要があります。
ところで、これは私がChrisFの答えで例外をとるところです。クリーンアップを行う必要があるかどうかを判断するのはドライバーの責任ではありません。OSドライバーモデルは、ユーザーモードのOpenGLドライバー(マシンで共有されているため、実際のgfxリソース割り当てを行うべきではありません)、OS(リソースを割り当てるためのシステムコールと同等のものを提供します)、およびカーネルモードドライバー(gpuと互換性のある方法でOSオーダーを実行するためだけにあります)。これは、少なくともWIN2KおよびWDDMモデルの場合です。
したがって...プロセスがクラッシュまたは終了した場合、これらのモデルでは、プロセスに関連付けられていたすべてのリソースを解放するためにカーネルモードドライバーを呼び出すのはOSの責任です。
さて、あなたがすべきかどうかは、実際にはソースコードのタブまたはスペースを尋ねるようなものです。ここでは、人によって信念が異なります。「OSはとにかくそれを行います。すぐに終了する方がエンドユーザーエクスペリエンスが向上します」vs「プログラムが長時間実行されている場合は、OOMエラーが発生したくないので、メモリリークが発生しているかどうかを知りたいです。 。それを行うための最良の方法は、全体を通して漏れがないことです」と私が知っている2つの主要な考え方です。
プログラムが終了(またはクラッシュ)した場合、プログラムの終了時にメインメモリが通常解放されるのと同じ方法で、現在割り当てられているメモリを最終的に解放する必要があります。GPUがメモリを再び使用できるようになるまで、しばらく時間がかかる場合があります。
ただし、この動作はグラフィックカードドライバの実装方法に依存する可能性があるため、この動作に依存しないでください。(プログラマーとして)そのメモリーが二度と必要ないことがわかっている場合は、明示的なクリーンアップ呼び出しを行う方がはるかに優れています。
プログラムが終了すると、すべてのGPUリソースが解放されます。テストする簡単な方法は、物事を削除せず、アプリを繰り返し実行して、数回の反復後に割り当てが失敗するかどうかを確認することです。