Xna Xbox подставил, когда GC начинает - PullRequest
2 голосов
/ 21 февраля 2012

Я разрабатываю приложение (XNA Game) для XBOX, которое является довольно простым приложением.Стартовая страница содержит плитки с движущимися изображениями GIF.Эти gif-изображения фактически являются png-изображениями, которые загружаются один раз каждой плиткой и помещаются в массив.Затем, используя определенную задержку, эти изображения воспроизводятся (с помощью счетчика, который увеличивается каждый раз, когда проходит задержка).

Все это работает хорошо, однако я заметил небольшое отставание каждые x секунд в движении GIFизображений.Затем я начал добавлять некоторые тесты:

http://gyazo.com/f5fe0da3ff81bd45c0c52d963feb91d8

Как вы можете видеть, FPS довольно низок для такой простой программы (Это отладка, когда приложение запускается изСам Xbox, я получаю в среднем 62fps).2 важных параметра: Graphics.SynchronizeWithVerticalRetrace = false;IsFixedTimeStep = false;

Изменение isFixedTimeStep в значение true увеличивает лаг.Панель настроек имеет колеса, которые вращаются, и вы можете видеть, что колеса вращаются немного назад каждые x секунд.То же самое относится к SynchronizeWVR, также увеличивает задержку.

Я заметил связь между задержкой и моментом, когда включается сборщик мусора, каждый раз, когда он включается, возникает задержка ...

Не обращайте внимания на MAX HMU (использование памяти кучи), так как для этого требуется время запуска, среднее значение более реалистично.

Вот еще один экран монитора производительности, однако я не понимаю,многое из этого инструмента, впервые я использую его ... надеюсь, это поможет:

http://gyazo.com/f70a3d400657ac61e6e9f2caaaf17587

1 Ответ

0 голосов
/ 23 февраля 2012

После небольшого исследования я нашел виновника.

У меня есть пользовательские компоненты, которые являются производными от GameComponent и добавлены в список компонентов основного класса Game.

Это была одна (из 2) основная проблема, заставляющая обновлять все, что не требовало обновления. (Метод draw был единственным, кто помнил состояние страницы и рисовал только при необходимости). Я исправил это, используя разные «экраны» (или страницы, как я их назвал), которые являются единственными компонентами, которые являются производными от GameComponent.

Затем я обновляю только страницу, которая активна, и пользовательские компоненты на этой странице также обновляются. Проблема устранена.

Вторая большая проблема заключается в следующем; Я сделал класс, который помогает мне позиционировать материал на экране, то есть относительно процентов и тому подобное. Родительские контейнеры, выравнивание и выравнивание и т. Д. И т. Д. Этот класс имел свойства для размера и векторов, но вместо сохранения вычисленного значения в вспомогательном поле я пересчитывал их каждый раз, когда обращался к свойству. Но для вычисления таких сложных вещей используются ссылки (например, на родительские и дочерние контейнеры), что очень усложнило CLR, потому что у него было много работы.

Теперь я перестроил весь класс позиционирования в полностью функциональный оптимизированный класс с другими флагами для пересчета при необходимости, и вместо капель в 20 кадров в секунду я теперь получаю в среднем 170 + кадров в секунду!

...