Как часто вызывать SpriteBatch.Begin () /. End ()? - PullRequest
5 голосов
/ 16 сентября 2011

Я ищу проблему с производительностью в части «Рисование» моего кода xna для Windows Phone 7, которая иногда возникает через несколько секунд.Есть ли лучшая практика, как / когда вызывать SpriteBatch.Begin, чтобы что-то нарисовать?Должен ли он вызываться для каждой пары спрайтов (в каждом классе, когда он рисует игрока, фон, фоновые объекты, ...) или вызов в начале -> рисовать все во всех подклассах - будет лучше для производительности?

Ответы [ 2 ]

2 голосов
/ 16 сентября 2011

Вы не должны использовать их больше, чем необходимо, потому что Begin () означает подготовку устройства к визуализации спрайта, а End () означает восстановление его предыдущего состояния.Это может варьироваться в зависимости от некоторых флагов в Begin (), говорящих о том, что вы не хотите изменять состояние, и может усложнить ваш код, потому что вам придется вручную устанавливать некоторые состояния.

Изменения состояния устройства часто бывают медленными, и вы должны избегать их выполнения, если они не требуются, они также могут мешать всему, что вы делаете, поэтому, если вы хотите визуализировать что-то не в SpriteBatch, вы должны вызвать End (),но если вы рендерите спрайты, вы должны вызывать его один раз для всех спрайтов.

Чтобы предотвратить вызов End () для изменения состояний, которые не отображаются на предыдущем спрайте, вы должны вызвать Flush () вместо End ().Это делает спрайты в очереди с текущими преобразованиями и состояниями устройства, но оставляет состояния нетронутыми.Функция End () выполняет вызов Flush () и сбрасывает определенные состояния, установленные Begin ().

2 голосов
/ 16 сентября 2011

Лучше всего с точки зрения производительности - вызывать begin / end только один раз за Draw (), это приводит к тому, что все спрайты в пакете обрабатываются видеокартой одновременно. Вы должны использовать только несколько спрайтов, если вам нужно. Примеры того, когда вам может понадобиться:

  • Вы хотите применить эффект только к определенным спрайтам, но не к другим
  • Вы хотите сделать скриншот
  • Вы хотите сделать что-то более сложное с эффектами

Может кто-нибудь придумать другую причину множественных групп спрайтов (начало-> конец)?

...