Разница в производительности между различными способами рисования прямоугольников из текстур в xna?

Я пытаюсь разработать JRPG / dungeon crawler в качестве летнего проекта, и я убираю свой код. В бою существуют «шкалы здоровья», и одна шкала здоровья состоит из 3 прямоугольников, которые необходимо нарисовать для каждого персонажа (всего 2-8 символов в зависимости от контекста означают до 24 прямоугольников шкалы здоровья одновременно).

Мой старый способ рисования полоски здоровья основывался на одной текстуре, где я взял один пиксель и нарисовал поверх прямоугольной области. В основном я использовал текстуру «HealtBar» в качестве цветовой палитры ... например, если исходный прямоугольник был (0, 0, 1, 1), он представлял собой черный прямоугольник.

Texture2D mHealthBar;
mHealthBar = theContentManager.Load<Texture2D>("HealthBar");

public override void Draw(SpriteBatch theSpriteBatch)
        {
            //draw healtbar
            theSpriteBatch.Draw(mHealthBar, new Rectangle((int)Position.X+5,
            (int)(Position.Y - 20), (MaxHealth * 5)+7, 15),
            new Rectangle(0, 0, 1, 1), Color.Black);

            theSpriteBatch.Draw(mHealthBar, new Rectangle((int)(Position.X + 8),
            (int)(Position.Y - 17), ((MaxHealth * 5)), (mHealthBar.Height) - 2),
            new Rectangle(2, 2, 1, 1), Color.White);

            theSpriteBatch.Draw(mHealthBar, new Rectangle((int)(Position.X + 8),
            (int)(Position.Y - 17), ((Health * 5)), (mHealthBar.Height) - 2),
            new Rectangle(3, 2, 1, 1), Color.Red);
      }

это не красивое решение ... поэтому вместо этого я попытался создать абстрактный класс, который уменьшил бы объем кода и повысил его ясность.

abstract class Drawer
{
    static private Texture2D _empty_texture;

    static public void DrawRect(SpriteBatch batch, Color color, Rectangle rect)
    {
        _empty_texture = new Texture2D(batch.GraphicsDevice, 1, 1);
        _empty_texture.SetData(new[] { Color.White });

        batch.Draw(_empty_texture, rect, color);
    }
}

С новым классом Drawer я мог отбросить переменную mHealthBar и нарисовать прямоугольники более красивым кодом. Но когда я начал использовать новый способ рисования, у игры начались проблемы с частотой кадров, старый способ был гладким ... в чем причина проблем с частотой кадров?

        Drawer.DrawRect(theSpriteBatch, Color.Black, new Rectangle((int)Position.X+5,
        (int)(Position.Y - 20), (MaxHealth * 5)+7, 15));

        Drawer.DrawRect(theSpriteBatch, Color.White, new Rectangle((int)(Position.X + 8),
        (int)(Position.Y - 17), (MaxHealth * 5), 9));

        Drawer.DrawRect(theSpriteBatch, Color.Red, new Rectangle((int)(Position.X + 8),
        (int)(Position.Y - 17), (Health * 5), 9));

person Olle89    schedule 02.08.2011    source источник


Ответы (1)


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

Что вам нужно сделать, так это создать текстуру только один раз (при загрузке другого контента).

person George Duckett    schedule 02.08.2011