2012-03-06 34 views
2

XNAのパフォーマンスの低下に関する質問があります。私は自分のゲームを作成するためにMicrosoftのGameStateManagementの例を使用しています。私は現在、メインメニュー画面(GameScreen)、スプラッシュ画面(Game Screen)、ハイスコア画面(GameScreen)、ゲームプレイ画面(GameScreen)、およびオプションメニュー(MenuScreen)を持っています。私は約48時間前から運用前の環境でゲームを実行していました。メインメニュー画面、スプラッシュ画面、ハイスコア画面を5秒ごとに36時間ほど切り替えた後、ゲームのパフォーマンスは本当にヒットし、反応しなくなり、フレームレートは約3fpsに低下します。XNAのパフォーマンスの低下GameStateManagement

GameStateManagementの例でこの問題を追跡する方法はありますか。基本クラスを変更していないので、ScreenManagerに追加する子クラスを作成しました。

私はこれを行う新しい画面に切り替える:メインメニューに戻り

 foreach (GameScreen screen in ScreenManager.GetScreens()) 
     screen.ExitScreen(); 
     ScreenManager.AddScreen(new BackgroundScreen(), null); 
     ScreenManager.AddScreen(new HighScoreScreen(), null); 

ハイスコア画面に

 foreach (GameScreen screen in ScreenManager.GetScreens()) 
     screen.ExitScreen(); 
     ScreenManager.AddScreen(new SplashBackgroundScreen(), null); 
     ScreenManager.AddScreen(new SplashScreen(), null); 

スプラッシュ画面ハイスコア画面を:画面をスプラッシュが

メインメニュー画面

 foreach (GameScreen screen in ScreenManager.GetScreens()) 
     screen.ExitScreen(); 
     ScreenManager.AddScreen(new BackgroundScreen(), null); 
     ScreenManager.AddScreen(new MainMenuScreen(), null); 

私はインテルHD2000グラフィックを搭載したインテルi3-2100で4GBのRAMを搭載したWindows 7 Home Premium x64を実行しています。

XNAでメモリリークをチェックできるツールはありますか。このような問題を追跡するための良い方法はありますか?手動で各ゲーム画面のコンストラクタでガベージコレクションを呼び出すのが助けになるでしょうか?上記を明確にするために

EDIT

:実際には、XNAに関連するメモリリークを見つけるための最も効率的なツールは何ですか?

ScreenManagerクラスは、ゲームのスクリーンのスタックを追跡します.ExcelScreenを呼び出すと、ScreenManagerクラスはスタックからスクリーンを削除します。

ExitScreen()GameScreenの親クラスで:

public void ExitScreen() 
    { 
     if (TransitionOffTime == TimeSpan.Zero) 
     { 
      ScreenManager.RemoveScreen(this); 
     } 
     else 
     { 
      isExiting = true; 
     } 
    } 
+1

"XNAでメモリリークをチェックできるツールはありますか?" - メモリ使用量をプロファイルするツールがたくさんあります。例えば、より多くの情報が必要です。画面の新しいインスタンスを作成するか、単一インスタンスを使用しますか? NO SENSEを行う画面を切り替えるたびに、新しい画面を作成するのが見えます。 –

+1

"XNAでメモリリークをチェックできるツールはありますか?" - MicrosoftからCLR Profiler 4を入手してください。 –

答えて

3

私は、XNAをプログラムしていないが、それはあなたがメモリリークの原因となるように見えます。

ScreenManager.GetScreens()はGameScreenの列挙型を返します。 screen.ExitScreen()はScreenManagerのGameScreensの基礎コレクションからGameScreenリファレンスを削除しますか?

は、あなたが新しいインスタンス

ScreenManager.AddScreen(new ..., null); 

を追加することが、決して終了しました/古い/未使用のインスタンスを削除しないように私には思えます。

"GameScreen"インスタンスをプログラムの最初にScreenManagerに追加し、State Changeイベントで必要な "GameScreen"だけを非表示にすることができます。

+1

新しいインスタンスを作成する必要はありません。彼は、必要に応じてこれらの画面を表示/非表示にするだけです。最悪の場合、彼はそれらをメモリーからアンロードし、最後の状態を構成ファイルに保存して、同じ状態を再度ロードします。 –

+1

"プログラムの開始時に一度あなたのすべての" GameScreen "インスタンスをScreenManagerに追加して、" GameScreen "の状態変更イベントを隠す/表示するだけかもしれません。彼は知っている。 – ClassicThunder

+0

私のコードに戻って、私はスプラッシュ画面のゲーム状態からすべての画面を終了するのを忘れてしまった。私は誤ってthis.ExitScreen()をしていたので、スプラッシュ画面の背景がぶら下がり、ゲームが停止します(バックグラウンド画面のインスタンスがますます作成されていますが、ScreenManagerで削除されていないため)。 – NexAddo

関連する問題