Пользовательская реализация DEFLATE для ускорения кодирования PNG

Я оптимизирую кодировщик PNG для использования во Flash SWF (но пишу его в Haxe).

Мне пока удалось немного ускорить процесс, в основном с помощью быстрое чтение / запись в память.

При профилировании кода я заметил, что около 75% времени тратится на один вызов встроенного Flash compress (), который использует алгоритм zlib (который, в свою очередь, использует DEFLATE).

Я не слишком привередлив к степени сжатия, но более быстрое сжатие было бы замечательно. Итак, мне было интересно, стоит ли самому пытаться реализовать zlib / DEFLATE. Небольшой поиск позволил найти источник zlib C-реализации, но это не совсем легкое чтение (или простота переноса!).

Есть ли какие-нибудь простые реализации zlib / DEFLATE, которые я мог бы использовать в качестве отправной точки? Я бы предпочел не пробираться через два specs, тем более, что я не знаю, может ли реализация, работающая в AVM2, работать так же быстро, как встроенная во Flash. на первом месте.


person Cameron    schedule 13.06.2011    source источник


Ответы (3)


Я не думаю, что вы сможете добиться лучших результатов с неродным алгоритмом дефляции. Однако вы можете запустить его асинхронно, что может иметь значение. Если вы хотите перенести его, я думаю, было бы лучше найти реализацию AS3 или JavaScript, например https://github.com/dankogai/js-deflate. Удачи!

person Waneck    schedule 13.06.2011
comment
похоже, здесь есть написанный haXe алгоритм Inflate code.google.com/p/hxformat/source/browse/trunk/format/tools/ - person Waneck; 13.06.2011
comment
Спасибо, Ванек, я посмотрю на них. Надув HaXe - это интересно, но мне нужно только спустить воздух ;-) - person Cameron; 13.06.2011
comment
@Cameron О, понял :). Кажется, здесь есть порт zlib для as3 code.google .com / p / as3zlib. Я не вдавался в подробности, но похоже, что все это реализовано с нуля. Вероятно, он будет работать хуже, но тогда вы можете вычислить его часть для каждого ENTER_FRAME, чтобы приложение не зависало. Ваше здоровье! - person Waneck; 14.06.2011
comment
@Waneck: О, это должно пригодиться. Прочитав комментарий автора, я понял, что compress() Flash не использует deflate, он использует zlib, который, в свою очередь, использует deflate (а в спецификации PNG сказано, что сжатие должно быть в формате zlib). Итак, мне все еще нужно реализовать deflate, но я пренебрегал zlib ;-) - person Cameron; 14.06.2011
comment
Формат zlib - это всего лишь простая оболочка для формата deflate. Таким образом, если вы можете сдуть и вычислить контрольную сумму Adler32 (что довольно просто), у вас есть формат zlib. - person Paŭlo Ebermann; 16.06.2011
comment
@Waneck: +1, спасибо! Я наконец закончил свою реализацию, которую в конечном итоге сделал с нуля, и она сопоставима по производительности с собственным кодом, который использует Adobe (конечно, всегда с компромиссами, но моя была специально предназначена для данных PNG, которые, как правило, сильно избыточны) . Я также поддерживаю асинхронное кодирование. См. Мой ответ подробнее. - person Cameron; 13.11.2011

В итоге я реализовал deflate / zlib с нуля и только что выпустил его и созданный поверх него кодировщик PNG на GitHub (README). Я также написал в блоге сообщение о кодировщике PNG с эталонный тест, сравнивая его с другими кодировщиками.

Реализация сжатия содержится в DeflateStream.hx, и ей удается ускорить значительно улучшает процесс кодирования (и позволяет сделать его полностью асинхронным).

person Cameron    schedule 13.11.2011

попробуйте использовать fzip или ascompress

person Eugeny89    schedule 13.06.2011
comment
Спасибо, но оба они используют встроенные во Flash методы deflate () / compress () для фактического сжатия. - person Cameron; 13.06.2011