August 21st, 2007

nyaload

darth optimization

Сегодня оптимизировал один фильтр для картинок, который хитрым образом продолжает RGB канал в область альфы не равной 255 (для улучшения пожатия RGB-канала в JPEG). Делает он это кусочками 16x16, так как они жмутся jpeg совершенно независимо (заодно это решает проблему с тем, что фотошоп оставляет в PNG-файлах мусор в области нулевой альфы).
Код - запутаный. Совсем не алгоритмически идеальный, но без очевидных дефектов влияющих на производительность, типа "а чо это у нас в цикле считается одно и тоже, давайте вынесем". Если его оптимизировать - значит, надо сделать совершенно новый алгоритм. Или переписать на MMX. И то, и другое - переписывание с нуля, один-два дня работы.
И тут меня осенило - фильтр обрабатывает картинки кусочками 16x16, и большая часть этих кусочков - либо совершенно прозрачные (alpha == 0), либо непрозрачные (alpha == 255). В первом случае RGB просто обнуляется, во втором - просто копируется без всякой фильтрации. Хоп, и буст в три раза за двадцать минут работы.

Вот отладочный вывод, у некоторых картинок он получился интересным:

. - alpha == 255, кусочек без прозрачности
пробел - alpha == 0, совершенно прозрачный кусочек
* - ни то, ни другое, кусочек на границе прозрачной и непрозрачной области, или содержит полупрозрачность.

Collapse )