Alchemy PNG encoder を Spark

高速化に繋がらなくて一度は捨てかけた Alchemy + libpng + zlib の PNG エンコーダを Spark した。 使い方とか svn の URL は dsk/PNG – Spark project から。

拾った理由は、こんな感じ。 AS3 では ByteArray.compress() メソッドを叩くと、 deflate 圧縮して zlib 形式にフォーマットしてくれるんだけど、 冗長性のない ByteArray の圧縮は高速に処理できるけど、 PNG フォーマットに定義されているフィルタ処理で冗長化してから compress() すると処理にやたらと時間がかかる。 フィルタリングする前提だと、 zlib 圧縮率を低めにすれば十分高速に処理でき、 zlib 圧縮率よりもフィルタリングの有無の方がファイルサイズ縮小のメリットが大きいけど、 compress() メソッドでは zlib 圧縮率を設定できない。 あとは、 Alchemy だと非同期に処理するコードも簡単に書けるから、大きなサイズの BitmapData をエンコードする場合などもメリットありそうだし。

Alchemy の非同期処理は進捗とかを関数の参照渡しで C から AS の関数をコールして通知するんだけど、これって AS3 ライクじゃないんでイベントを発行する形にラップしてある。 あと、デバッグ用にちょっとだけデコードしてチャンクの情報とかを XML にして返す関数も実装。


About this entry