#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 () для фактического сжатия