7

そこで、PCゲームをXbox 360で動作するように変換したかったのです。これは、Intel Core 2 Quad@2.40GhzとRadeon4850512MBを使用して、PC上で問題なく動作しました。

Xboxに移植したところ、すぐにリストのインポートに関する不変性と継承に問題があったため、.Cast <>()というLINQメソッドを使用しました。

その方法に大きなオーバーヘッドがかかる場合は、私に知らせてください。何らかの理由でパフォーマンス分析を360にデプロイできないためです。おそらく、360で再生されるためです。

その後、別の問題が発生し、それは素晴らしいSystem.OutOfMemoryExceptionでした。私のスカイボックステクスチャは4096x4096だったので、それらを半分に減らすとそのエラーが削除されました。奇妙なことに、それらは3MB x 6しかないので、利用可能な512MBの多くを使用するべきではありません。

したがって、これらの問題がすべて解決されたときに、2秒あたり1フレームが導入されました。その後、ゲームプレイの1分後にクラッシュします。これは、「コード4」の意味です。

それはパワーポイントのように機能します。これがPCゲームプレイからのパフォーマンス分析画像です。彼らは悪くない。

CPU: http: //i.imgur.com/JYx7Z.png RAM: http: //i.imgur.com/C29KN.png そして72%=150MB気になります。

ここにいる誰かがこの問題についてある程度の経験を持っていることを願っています。率直に言って、私はすべての耳です。

4

1 に答える 1

10

パフォーマンスの問題の根本的な原因は、ゲームの実行中(起動後、Draw/Updateループ中)にメモリを割り当てているためです。

Windowsではこれで問題ありません。Windowsのガベージコレクターは世代を超えており(可能な場合にのみ新しいオブジェクトをクリーンアップします)、非常に高速です。いつ実行するかについても賢いです。

一方、Xbox 360のガベージコレクターは、完全にゴミです。割り当てられたメモリ1MBごとに実行されます。実行時に、管理対象ヒープ全体をチェックします。そして、起動するのはかなり遅いです。

したがって、答えは、ゲームが実行状態にある間はメモリを割り当てないことです。

これについての良いブログ投稿がここにあります。(また、メモリを割り当てないことの代替案(ヒープの複雑さを軽減すること)についても説明します。これは、実装が非常に困難であり、お勧めしません。)

  • LINQが作成するクエリオブジェクトはヒープオブジェクトであり、頻繁に必要なデリゲートであるため、LINQなどを削除する必要があります。代わりに単純なループを使用してください。
  • 描画/更新で独自の参照型を割り当てる場合は、可能な場合は値型を使用するように変換するか、オブジェクトプーリングを追加する必要があります。
  • オブジェクトの作成stringは、メモリ割り当てのもう1つの一般的なソースです。代わりに、を再利用しStringBuilderて直接レンダリングできます。
  • 物事(特に:数字)を文字列に変換すると、StringBuilderメモリが割り当てられます。割り当てのない代替案を作成/検索する必要があります。この同様の質問に対する私の答えには、に対するものがありintます。

メモリを割り当てている場所を診断する最良の方法は、WindowsでCLRプロファイラーを使用してゲームを実行することです。これにより、メモリが割り当てられている場所と時期がわかります。割り当てがなくなるまで最適化するだけです。

(または、レベル/マップ/部屋などごとに1MB未満を確実に割り当てるまで、静的ロード画面やフェードトゥブラックなど、スタッターが適切な時間帯に手動GCを実行します。)

コード4は未処理の例外です。原因を特定するには、メッセージを出力する最上位の例外ハンドラーをインストールするか、デバッガーでゲームを実行する必要があります。

最後に:これはおそらくテクスチャの圧縮サイズです(PNGまたはJPEGなどを使用)。テクスチャが圧縮されていない場合、4096×4096×6×4バイト=384MB。これは巨大です-あなたがメモリを使い果たしたのも不思議ではありません。DXT1を使用してそれらを圧縮し、6分の1に小さくすることができます(手順wiki)。また、解像度を下げることもできます。そして、あなたはまったく底面が必要ですか?

于 2012-08-12T13:19:13.597 に答える