XNA性能下降GameStateManagement
本文关键字:GameStateManagement 性能 XNA | 更新日期: 2023-09-27 18:26:49
我有一个关于降低XNA性能的问题。我正在使用微软的GameStateManagement示例来创建我的游戏。我目前有一个主菜单屏幕(GameScreen)、一个启动屏幕(Game screen)、高分屏幕(GameScreen)、游戏播放屏幕(GameScreen)和一个选项菜单(MenuScreen)。我已经让我的游戏在预制作环境中运行了大约48小时。在主菜单屏幕、启动屏幕和高核心屏幕之间每五秒钟切换一次,持续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);
我运行的是带有4GB RAM的Windows 7 Home Premium x64,搭载英特尔HD2000显卡的英特尔i3-2100。
是否有任何工具可用于检查XNA中的内存泄漏。有什么好的策略可以开始追踪这样的问题吗?在每个游戏屏幕的构造函数中手动调用垃圾收集会有帮助吗?
编辑
为了澄清以上内容:在实践中,找到与XNA相关的内存泄漏的最有效工具是什么?
ScreenManager类跟踪游戏的屏幕堆栈,当您调用ExitScreen时,它会将其从堆栈中删除。
GameScreen父类中的ExitScreen():
public void ExitScreen()
{
if (TransitionOffTime == TimeSpan.Zero)
{
ScreenManager.RemoveScreen(this);
}
else
{
isExiting = true;
}
}
我没有对XNA进行编程,但它看起来像是您造成的内存泄漏。
ScreenManager.GetScreens()缝合以返回可枚举的GameScreen。做屏幕。ExitScreen()从ScreenManager的GameScreens底层集合中删除GameScreen引用?
在我看来,似乎你添加了新的实例
ScreenManager.AddScreen(new ..., null);
但从不删除已退出/旧的/未使用的实例。
也许你可以在程序开始时将所有的"GameScreen"实例添加到ScreenManager中一次,然后在状态更改事件中隐藏/显示你想要的"GameScreen"。