Рисование всех DrawableGameComponents в одном пакете - PullRequest
0 голосов
/ 28 декабря 2010

Это вопрос XNA ...

У меня есть большое количество объектов DrawableGameComponents в моей игре, и все они используют один и тот же SpriteBatch. Однако мне приходится каждый раз вызывать SpriteBatch.Begin () и .End () для рисования каждого компонента. Я хочу нарисовать все в одном пакете для повышения производительности, но я не знаю, куда могут пойти .Begin () и .End (), так как .Draw () вызывается автоматически (так как они DrawableGameComponents)

Кто-нибудь знает, что я могу сделать, чтобы они все рисовались между одним вызовом .Begin () и .End (), сохраняя их как DrawableGameComponents?

Edit:

Хорошо с этого сайта http://www.progware.org/Blog/post/XNA-Game-Development-(Decentralize).aspx Я подумал, что он вызывается в вызове основного игрового цикла. Вызовraw () ... так что я могу просто обернуть это с помощью методов Begin и End

protected override void Draw(GameTime gameTime) {
    if (Cell.Cell.CellSpriteBatch != null) {
        Cell.Cell.CellSpriteBatch.Begin(
            SpriteSortMode.BackToFront, BlendState.AlphaBlend, 
            SamplerState.AnisotropicClamp, null, null, null,
            gamePlay.Camera.GetTransformation()
        );
    }

    base.Draw(gameTime);

    if (Cell.Cell.CellSpriteBatch != null) {
        Cell.Cell.CellSpriteBatch.End();
    }
}

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

Есть какое-нибудь решение для этого?

1 Ответ

0 голосов
/ 28 декабря 2010

Во-первых, если вы уже не знаете, что вы ограничены партиями, вероятно, это не стоит делать.Если каждый вызов .Draw извлекает из одной и той же текстуры, вы можете увидеть некоторое ускорение.Если это разные текстуры, то переключение на один Begin / End не будет иметь никакой разницы.SpriteBatch все равно прервет ваши вызовы отрисовки.

Поскольку вы обнаружили, что это делает ваш код слишком запутанным - вы должны отслеживать между компонентами.

Единственное решение вашей текущей проблемы -сделайте SpriteBatch Immediate так, чтобы он рисовал при вызове вызовов вместо рисования при завершении вызова.Однако это убьет ваш перф, так как пакетирование вообще не производится.

Лично я бы придерживался Begin / End для каждого компонента, пока вы не столкнетесь с проблемой перфорирования.Предполагая, что у вас нет 5000 компонентов, в этом случае вам, вероятно, нужно будет немного по-другому сконструировать вещи.

...