私の現在のプロジェクトには植生シミュレーションが含まれており、時間の経過とともに成長および再生する多数のインスタンス化された樹木モデルをレンダリングできます。
現在、このコード行で一貫した OutOfMemory 例外が発生しています
if (treeInstances.Length <= currentIndex)
Array.Resize(ref treeInstances, currentIndex + 500);
このコードは、シミュレーションが配列の通常の境界を超えたときに実行treeInstances
され、ツリー用に追加の 500 スロットを持つ新しい配列を割り当てます。
失敗したときの配列のサイズ (通常は 3000 から 5000 のインスタンスの間) とTreeInstance
構造体のサイズ (20 個の浮動小数点数) を確認できることを考えると、私の問題は配列の生のサイズにあるのではないと確信しています。resize/8 プロセス中に一時的に 2 倍にする必要があることを考慮しても (Array.Resize()
新しい配列を割り当てるため)、私の数学が正しいと仮定すると、まだ半分の MB 未満です。
したがって、私が見逃しているものがあるに違いないと思います。古い配列がガベージ コレクターによって削除されない理由はありますか?
詳細:
TreeInstance
各ツリーの変換行列と色を含む単純な構造体です。treeInstances
TreeInstance[]
配列です。これは、上記のコード行で直接使用されるだけです。treeInstances
TreeInstances
経由でアクセスするProperty もあります。get;set;
TreeInstances
Draw
成長する各ツリーの変換マトリックスと色を設定するために使用され、ルーチン の一部としてインスタンス化メソッドに供給されます。- 私はあまりよく知らないインスタンス化メソッドですが、その
TreeInstances
内容を変更せずにさまざまな機能を実行します (操作でソースとして使用することを含むDynamicVertexBuffer.SetData
)。