XNA性能降级GameStateManagement

问题描述:

我有一个关于降低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

我不编程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