XNA性能下降游戏状态管理

时间:2012-03-06 16:43:44

标签: c# performance xna

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

1 个答案:

答案 0 :(得分:3)

我没有对XNA进行编程,但它看起来像是导致内存泄漏。

ScreenManager.GetScreens()接缝返回可枚举的GameScreen。 screen.ExitScreen()是否从ScreenManager的GameScreens底层集合中删除了GameScreen引用?

对我来说就像你添加新实例一样

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

但永远不要删除已退出/旧/未使用的实例。

也许您可以添加所有" GameScreen"屏幕管理器在程序开始时执行一次,然后在状态更改事件中隐藏/显示您想要的" GameScreen"