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


Быстрая обработка спрайтов без применения 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, результат складывается

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


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


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

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

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

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





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