2012-03-06 57 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 SplashBackgroundScreen(), null); 
     ScreenManager.AddScreen(new SplashScreen(), null); 

初始屏幕排行榜屏幕

 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 BackgroundScreen(), null); 
     ScreenManager.AddScreen(new MainMenuScreen(), null); 

我在具有英特爾HD2000顯卡的英特爾i3-2100上運行帶有4GB內存的Windows 7家庭高級版x64。

是否有可供您在XNA內存泄漏任何工具。有沒有什麼好的策略來開始追蹤這樣的問題?會在每個遊戲畫面的構造函數中手動調用垃圾回收幫助?

編輯

爲了澄清以上:在實踐中,什麼是最有效的工具,以找到與XNA內存泄漏?

屏幕管理類跟蹤的遊戲畫面中的堆疊的,當你調用ExitScreen它從棧中刪除。

ExitScreen()在GameScreen父類:

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

「是否有任何工具可用於檢查XNA中的內存泄漏?」 - 有大量的工具來分析內存使用情況。我們需要更多信息。你是否創建了一個屏幕的新實例或者是否使用了單個實例?根據我看到您每次切換屏幕時都會看到您創建新屏幕,這使得NO SENSE無效。 – 2012-03-06 17:06:27

+1

「是否有可供您在XNA內存泄漏任何工具。」 - 從Microsoft獲取CLR Profiler 4。 – 2012-03-07 03:53:46

回答

3

我不編程XNA,但它看起來像你造成內存泄漏。

ScreenManager.GetScreens()接縫返回GameScreen的枚舉。 screen.ExitScreen()是否從ScreenManager的底層GameScreens集合中移除GameScreen引用?

我看來,像你添加新的實例

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

但從來沒有刪除已退出/老/未使用的實例。

也許你可以在你的程序的開頭添加所有的「GameScreen」實例的ScreenManager一次,然後隱藏/顯示只是「GameScreen」的你想在State Change事件。

+1

他不應該創建新的實例。他應該能夠根據需要使這些屏幕可見/隱藏。最糟糕的情況下,他將它們從內存中卸載,將最後一個狀態保存在配置文件中,然後再次加載相同的狀態。 – 2012-03-06 17:23:51

+1

‘一旦在你的程序的開始屏幕管理實例,然後隱藏/顯示只是「‘也許你可以添加所有’GameScreen GameScreen’的你想在State Change事件。」他知道。 – ClassicThunder 2012-03-06 19:56:58

+0

回去看我的代碼,我忘了從我的閃屏遊戲狀態退出所有的屏幕,我意外地有this.ExitScreen(),所以在啓動畫面背景是遊逛和促進越來越多的平局和更新週期,從而減緩遊戲關閉(由於屏幕管理器中正在創建背景屏幕的實例越來越多,但未刪除)。 – NexAddo 2012-03-07 14:01:02