У меня есть вопрос об ухудшении производительности в 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;
}
}