C# ネイティブ相互運用性を学ぶために、私は OpenGL ラッパーに取り組んできました。OpenGL API 自体は、特定のスレッドにバインドされたステート マシンです。ネイティブ リソースを含むオブジェクトがガベージ コレクションされると、ファイナライザーは GC スレッドで実行され、リソースを直接解放することはできません。
私が現在持っている回避策は、オブジェクトがリソースを追加し、描画ループの安全なポイントで反復してそれらを解放するコンテキスト オブジェクトにリストを作成することです。
ただし、これの問題は、GC がそのリストを繰り返し処理しているときに収集すると、コレクションが変更されているため foreach が失敗することです。GC はほとんどの実装でストップザワールドであるため、リストの周りにミューテックスを配置することはできません。描画ループがそれをロックした場合、反復を完了して再びロックを解除することはありません。
通常、MTBF は約 2 時間のゲームプレイですが、1 秒あたり数千のオブジェクトで意図的にストレス テストを行った場合、わずか数秒で発生します。
ここで最善のアプローチは何ですか?