3

C# ネイティブ相互運用性を学ぶために、私は OpenGL ラッパーに取り組んできました。OpenGL API 自体は、特定のスレッドにバインドされたステート マシンです。ネイティブ リソースを含むオブジェクトがガベージ コレクションされると、ファイナライザーは GC スレッドで実行され、リソースを直接解放することはできません。

私が現在持っている回避策は、オブジェクトがリソースを追加し、描画ループの安全なポイントで反復してそれらを解放するコンテキスト オブジェクトにリストを作成することです。

ただし、これの問題は、GC がそのリストを繰り返し処理しているときに収集すると、コレクションが変更されているため foreach が失敗することです。GC はほとんどの実装でストップザワールドであるため、リストの周りにミューテックスを配置することはできません。描画ループがそれをロックした場合、反復を完了して再びロックを解除することはありません。

通常、MTBF は約 2 時間のゲームプレイですが、1 秒あたり数千のオブジェクトで意図的にストレス テストを行った場合、わずか数秒で発生します。

ここで最善のアプローチは何ですか?

4

4 に答える 4

1

次に、弾丸をかみ砕いて、リソース管理を GC に頼るのをやめるつもりです。アセット マネージャーのファイナライザー関数に依存するのではなく、割り当てたオブジェクトを削除するための明示的な関数をアセット マネージャーに持たせる必要があります。そして、コード内の特定の場所でその関数を呼び出す必要があります。

GC があるからといっ、それが最善または唯一のソリューションであるとは限りません。

于 2013-05-31T11:38:04.540 に答える