20

私は C# と .NET でゲームを作成しようとしています。ゲームの世界でゲーム オブジェクトを更新するメッセージを実装することを計画していました。これらのメッセージは、C# 参照オブジェクトになります。

ゲームをマルチプレイヤーにしたい場合、この方法でネットワーク経由で送信する方が簡単なので、このアプローチが必要です。

でも、大量のメッセージがあると、ガベージ コレクターにとってかなりのストレスになるのではないでしょうか。そして、それはゲームプレイに影響しませんか? メッセージ クラス自体は非常に小さく、多くても 4 つまたは 5 つのメンバーしかありません。

これらのメッセージは、ゲーム ワールド内のオブジェクトごとに 1 秒あたり数回生成されます。

4

2 に答える 2

23

.NET のガベージ コレクターには、ジェネレーション 0、ジェネレーション 1、ジェネレーション 2 の 3 つのジェネレーションがあります。GC がジェネレーション内のオブジェクトの収集に失敗するたびに、そのオブジェクトは次のジェネレーションに昇格します。

オブジェクトが 85kb を超えると、問題が発生する可能性があります。これらのオブジェクトは、ラージ オブジェクト ヒープに自動的に格納されます。大きなオブジェクト ヒープは、次の状況で自動的に収集されます。

  • 割り当てがラージ オブジェクト ヒープのしきい値を超えています。
  • システムのメモリが不足しています。
  • System.GC.Collectジェネレーション 2 で呼び出されます。

問題は、大きなオブジェクト ヒープが収集されるときに、オブジェクトのメモリの割り当てが解除されても、LOH が圧縮されないことです。SystemOutOfMemoryLOH は断片化されているため、LOHにオブジェクトに十分な大きさのスペースがない場合、例外がスローされる可能性があります。

通常、LOH のパフォーマンスを向上させるために、オブジェクト プーリングなどの手法が使用されます。 http://en.wikipedia.org/wiki/Object_pool_pattern

ソース: http://msdn.microsoft.com/en-us/magazine/cc534993.aspx

更新: .Net 4.5.1 では、GC.Collect API を使用して、アプリケーション内で LOH のオンデマンド圧縮を実行できます。

于 2013-04-26T09:17:28.950 に答える