DirectX9 - Эффективное рисование спрайтов - PullRequest
4 голосов
/ 01 июля 2011

Я пытаюсь создать платформерную игру, и я беру различные блоки спрайтов и собираю их воедино, чтобы нарисовать уровень.Это требует рисования большого количества спрайтов на экране каждый кадр.У хорошего компьютера нет проблем с обработкой прорисовки всех спрайтов, но он начинает влиять на производительность на старых компьютерах.Поскольку это НЕ большая игра, я хочу, чтобы она могла работать практически на любом компьютере.Прямо сейчас я использую следующую функцию DirectX для рисования моих спрайтов:

D3DXVECTOR3 center(0.0f, 0.0f, 0.0f);

D3DXVECTOR3 position(static_cast<float>(x), static_cast<float>(y), z);

(my LPD3DXSPRITE object)->Draw((sprite texture pointer), NULL, &center, &position, D3DCOLOR_ARGB(a, r, g, b));

Есть ли более эффективный способ рисовать эти картинки на экране?Есть ли способ, с помощью которого я могу использовать менее сложные файлы изображений (сейчас я использую обычные файлы png), чтобы ускорить процесс?

Подводя итог: Какой самый удобный способ рисования спрайтов в DirectX?спасибо!

Ответы [ 2 ]

4 голосов
/ 02 июля 2011

Используемый вами интерфейс ID3DXSPRITE уже довольно эффективен.Убедитесь, что все ваши вызовы отрисовки спрайта выполняются в одном пакете, если это возможно, между начальными и конечными вызовами спрайта.Это позволяет спрайтовому интерфейсу организовывать рисование наиболее эффективным способом.

Для дополнительной производительности вы можете загрузить несколько текстур меньшего размера в одну текстуру большего размера и использовать координаты текстур для их вывода.Это делает так, чтобы текстуры не приходилось менять местами так часто.См .:

http://nexe.gamedev.net/directknowledge/default.asp?p=ID3DXSprite

Тип файла, который вы используете для текстур, не имеет значения, поскольку они предварительно загружены в текстуры.Убедитесь, что вы загрузили их все в текстуры один раз, когда загружается игра / уровень.После того, как вы загрузили их в текстуры, не имеет значения, в каком формате они изначально были.

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

Редактировать:

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

Когда я говорю, что меняются текстуры, яозначает связывание их со стадией текстуры с помощью SetTexture.Каждый раз, когда вызывается SetTexture, происходит небольшое снижение производительности, поскольку оно меняет состояние стадии текстуры.Обычно эта задержка довольно мала, но может быть плохой, если DirectX вынужден вытягивать текстуру из системной памяти в видеопамять.

ID3DXsprite переупорядочивает отрисовки между начальными и конечными вызовами.Это означает, что SetTexture обычно вызывается только один раз для каждой текстуры, независимо от того, в каком порядке вы их рисуете.

Часто стоит загружать маленькие текстуры в большую.Например, если бы можно было уместить все маленькие текстуры в одну большую, то стадия текстуры могла бы просто оставаться привязанной к этой текстуре для всех рисунков.Обычно это дает заметное улучшение, но тестирование - это единственный способ узнать наверняка, насколько это поможет.Это выглядело бы ужасно, но вы могли бы просто добавить любую большую текстуру и сделать вид, что она комбинированная, чтобы проверить, какая разница в производительности.

2 голосов
/ 02 июля 2011

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

...