Статьи Королевства Дельфи

Быстрая обработка спрайтов без применения DirectX




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

Многие ют переход к аппаратному ускорению — DirectX и OpenGL. Но для повседневных задач желательно не отрываться от привычных средств, к тому же самую главную функцию — вывод на экран — WinAPI выполняет вполне удовлетворительно.

По-моему, лучшим выходом может стать использование обычных, хранимых в памяти изображений (TBitmap), создание и вывод их при помощи обычных средств при замене промежуточного звена, а именно процедур обработки спрайтов. За счет применения низкоуровнего кода, жесткой привязки изображений к определенному формату удается достичь вполне приемлемой производительности. Ускорение в 5-10-20 раз далеко не предел, особенно в процедурах, использующих MMX.

Для лучшей совместимости и с VCL, и с KOL я решил не инкапсулировать код в виде объекта, а оставить его в виде отдельных процедур с осмысленными названиями.

Модуль SpriteUtils решает 5 типовых задач:

  • простое копирование спрайта в спрайт [процедуры Get/Put];
  • отбрасывание (клиппирование) выходящих за границы областей [см. описание];
  • наложение с заданной прозрачностью [процедуры серии TransPaint];
  • наложение с заданным прозрачным цветом [процедуры серии TransPut];
  • снятие/наложение маски (определенного цвета) [процедуры серии MaskPut];
  • при наложении спрайта — автоматический его поворот вокруг вертикальной или горизонтальной осей [см. описание процедур Get/Put].

Не все функции можно достичь одной операцией и не все подходят для всех форматов. Более всего приветствуется формат 24 бита на пиксел, поэтому в прикладных задачах, скорее всего, понадобится комбинировать несколько процедур последовательно.

Для тех, кто заботится о совместимости со старым "железом", есть процедуры, не использующие MMX (и оттого более медленные).

Несколько примеров: Сложение спрайтов с заданной прозрачностью. Цвет источника умножается на прозрачность (0.0 — 1.0), цвет приемника на дополнение до 1, результат складывается



Наложение спрайта с одним маскированным цветом Копируются все пикселы источника кроме тех, которые равны выбранному прозрачному цвету


Наложение маски из спрайта Копируются только те пикселы источника, которые равны выбранному цвету

В архиве прилагаются:

  • описание всех процедур в виде HTML-каталога;
  • тестовый проект для сравнения скорости процедур со стандартными;
  • тестовые примеры для KOL и VCL.
Скачать архив с документацией и примерами (83 Кб)

Михаил Рудаков,
Freeware, 2003.





Содержание раздела