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

#flash #png #compression #haxe #deflate

#flash #png #сжатие #haxe #deflate

Вопрос:

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

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

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

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

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

Ответ №1:

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

Комментарии:

1. кажется, здесь есть написанный на haXe алгоритм раздувания code.google.com/p/hxformat/source/browse/trunk/format/tools /…

2. Спасибо, Ванек, я посмотрю на них. HaXe inflate интересен, но мне нужно только сдуть 😉

3. @Cameron О, понял : ) . Кажется, здесь есть порт zlib для as3 code.google.com/p/as3zlib . Я не слишком глубоко вникал в это, но, похоже, это реализует все это с нуля. Вероятно, это будет работать хуже всего, но тогда вы могли бы вычислять его часть для каждого ENTER_FRAME, чтобы приложение не зависало. Приветствия!

4.@Waneck: О, это должно пригодиться. Прочитав комментарий автора, я понял, что во Flash compress() не используется deflate, он использует zlib, который, в свою очередь, использует deflate (а в спецификации PNG сказано, что сжатие должно быть в формате zlib). Итак, мне все еще нужно реализовать deflate, но я пренебрегал zlib 😉

5. zlib Формат — это всего лишь простая оболочка вокруг deflate формата. Таким образом, если вы умеете дефлировать и способны вычислить контрольную сумму Adler32 (что довольно просто), у вас есть формат zlib.

Ответ №2:

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

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

Ответ №3:

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

Комментарии:

1. Спасибо, но оба они используют встроенные во Flash методы deflate () / compress () для фактического сжатия