我有一个关于降低XNA性能的问题。我正在使用Microsoft的GameStateManagement示例来创建我的游戏。我目前有一个主菜单屏幕(GameScreen),一个闪屏(游戏屏幕),高分屏幕(GameScreen),游戏播放屏幕(GameScreen)和一个选项菜单(MenuScreen)。我让我的游戏在预生产环境中运行了大约48小时。在主菜单屏幕,闪屏和高分屏幕之间每隔5秒钟切换36个小时后,游戏性能真的受到打击而变得无法响应,并且帧速率降至3fps左右。
无论如何都要在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);
我在带有Intel HD2000显卡的Intel i3-2100上运行带有4GB RAM的Windows 7 Home Premium x64。
是否有任何工具可用于检查XNA中的内存泄漏。是否有任何好的策略可以开始追踪这样的问题?会在每个游戏画面的构造函数中手动调用垃圾收集吗?
修改
澄清以上内容:实际上,找到与XNA相关的内存泄漏的最有效工具是什么?
ScreenManager类会跟踪游戏的一叠屏幕,当您调用ExitScreen时,它会将其从堆栈中删除。
GameScreen父类中的ExitScreen():
public void ExitScreen()
{
if (TransitionOffTime == TimeSpan.Zero)
{
ScreenManager.RemoveScreen(this);
}
else
{
isExiting = true;
}
}
答案 0 :(得分:3)
我没有对XNA进行编程,但它看起来像是导致内存泄漏。
ScreenManager.GetScreens()接缝返回可枚举的GameScreen。 screen.ExitScreen()是否从ScreenManager的GameScreens底层集合中删除了GameScreen引用?
对我来说就像你添加新实例一样
ScreenManager.AddScreen(new ..., null);
但永远不要删除已退出/旧/未使用的实例。
也许您可以添加所有" GameScreen"屏幕管理器在程序开始时执行一次,然后在状态更改事件中隐藏/显示您想要的" GameScreen"