Программирование игр для Windows. Советы профессионала


Кодирование прозрачности


Как я уже говорил в предыдущей главе, скорость бит-блиттинга можно увеличить, если использовать другие структуры данных. Наша основная проблема в отображении прямоугольных спрайтов заключается в реализации «прозрачности»: когда «прозрачный» пиксель (обычно 0, или черный) встречается в исходном изображении, пиксель фонового изображения остается неизменным (то есть не замещается). Эта операция выполняется с помощью оператора IF, и поэтому на нее тратится достаточно много времени.

Еще одно возможное решение данной проблемы заключается в применении к данным спрайта группового кодирования (run-lenght encoded, RLE), после которого последовательности «прозрачных» пикселей оказываются сгруппированными, как показано на рисунке 7.2.


Если мы разобьем наш отображаемый объект на столбцы или строки, то сможем проанализировать последовательности «прозрачных» пикселей и пометить их соответствующим образом. В этом случае мы могли бы включать и выключать «прозрачность» подобно тому, как с помощью переключателя зажигаем и гасим лампочку. Это происходит в несколько десятков раз быстрее, чем если бы мы тысячи раз повторяли оператор IF. Как осуществить групповое кодирование — решать вам, однако, в качестве отправной точки я предлагаю следующее:

§

Убедитесь, что данные спрайта записаны в формате:

столбец 1, столбец 2, ..., столбец N

где каждый из столбцов состоит из «прозрачных» и «непрозрачных» пикселей;

§          Чтобы обозначить каждый из типов пикселей, задайте флаг, например, 255 и 254; 

§          Следующий за флагом элемент данных должен определять длину последовательиости в байтах;                                          

§          Затем перечислите значения пикселей выделенной последовательности.

Декодировать столбец данных можно будет по такому алгоритму:

 

ЕСЛИ  

255: непрозрачный

254: прозрачный

тогда

(255 | 254) , количество байт данных, данные




Начало  Назад  Вперед