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性能下降GameStateManagement

我没有对XNA进行编程,但它看起来像是您造成的内存泄漏。

ScreenManager.GetScreens()缝合以返回可枚举的GameScreen。做屏幕。ExitScreen()从ScreenManager的GameScreens底层集合中删除GameScreen引用?

在我看来,似乎你添加了新的实例

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

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

也许你可以在程序开始时将所有的"GameScreen"实例添加到ScreenManager中一次,然后在状态更改事件中隐藏/显示你想要的"GameScreen"。

相关文章:
  • 没有找到相关文章