我有一个关于降低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;
}
}
“是否有任何工具可用于检查XNA中的内存泄漏?” - 有大量的工具来分析内存使用情况。我们需要更多信息。你是否创建了一个屏幕的新实例或者是否使用了单个实例?根据我看到您每次切换屏幕时都会看到您创建新屏幕,这使得NO SENSE无效。 – 2012-03-06 17:06:27
“是否有可供您在XNA内存泄漏任何工具。” - 从Microsoft获取CLR Profiler 4。 – 2012-03-07 03:53:46