Разница в производительности между различными способами рисования прямоугольников из текстур в XNA? - PullRequest
0 голосов
/ 02 августа 2011

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

Мой старый способ рисовать панель исцеления был основан на 1 текстуре, из которой я взял один пиксель и нарисовал область прямоугольной формы.В основном я использовал текстуру "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));

1 Ответ

1 голос
/ 02 августа 2011

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

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

...