Деградация производительности XNA GameStateManagement - PullRequest
2 голосов
/ 06 марта 2012

У меня есть вопрос об ухудшении производительности в XNA. Я использую пример GameStateManagement от Microsoft для создания своей игры. В настоящее время у меня есть экран главного меню (GameScreen), заставка (Game Screen), экран рекордов (GameScreen), экран игры (GameScreen) и меню параметров (MenuScreen). Моя игра работала в предсерийной среде около 48 часов. После переключения между экраном главного меню, заставкой и экраном рекордов каждые пять секунд в течение примерно 36 часов производительность игры действительно падает и становится не отвечающей, а частота кадров падает примерно до 3 кадров в секунду.

Есть ли способ отследить эту проблему в примере 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);

Я использую Windows 7 Home Premium x64 с 4 ГБ оперативной памяти на Intel i3-2100 с графикой Intel HD2000.

Существуют ли какие-либо инструменты для проверки утечек памяти в XNA. Есть ли какая-нибудь хорошая тактика, чтобы начать выслеживать подобные проблемы? Поможет ли ручной вызов сборки мусора в конструкторе каждого игрового экрана?

EDIT

Чтобы прояснить вышесказанное: На практике, каковы наиболее эффективные инструменты для обнаружения утечек памяти, связанных с XNA?

Класс ScreenManager отслеживает стек экранов для игры, когда вы вызываете ExitScreen, он удаляет его из стека.

ExitScreen () в родительском классе GameScreen:

    public void ExitScreen()
    {
        if (TransitionOffTime == TimeSpan.Zero)
        {
            ScreenManager.RemoveScreen(this);
        }
        else
        {
            isExiting = true;
        }
    }

1 Ответ

3 голосов
/ 06 марта 2012

Я не программирую XNA, но похоже, что вы вызвали утечку памяти.

ScreenManager.GetScreens () швы, чтобы вернуть множество GameScreen.Удаляет ли screen.ExitScreen () ссылку на GameScreen из основной коллекции ScreenScanan GameScreens?

Мне кажется, что вы добавляете новые экземпляры

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

Но никогда не удаляете Exited / old / неиспользуемые экземпляры.

Возможно, вы могли бы добавить все свои экземпляры "GameScreen" в ScreenManager один раз в начале вашей программы, а затем скрыть / показать только те "GameScreen", которые вам нужны для событий изменения состояния.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...