Optimized PNGEncoder

Alchemy – asynchronous jpeg encodingで OptimizedJPGEncoder や AlchemyJPGEncoder の処理速度比較をみて、 PNGEncoder も多少最適化できるかなと思ったんでやってみた。

PNGフォーマットはJPGフォーマットのように複雑な変換処理がない単純なフォーマットなので、コード量が少く最適化箇所も少ない。ただ、複数回エンコードしたり、サイズの大きな BitmapData をエンコードする際にはメリットがでてくるんじゃなかろーかと。

Optimized PNGEncoder – wonderfl build flash online

処理速度比較の為に as3corelib の PNGEncoder と同じく PLTE チャンクは実装せず、フィルタオプションは ‘None’ 一択で実装してる。 as3corelib にはない機能で、 BitmapData が不透明時の分岐を実装した。これをしとくことで BitmapData.transparent == false の BitmapData をエンコードした時にファイル容量が軽くなるはず。

最適化箇所をざっくり挙げとくと、 for 文の length をあらかじめ取得しとくとか、 for 文の中で何度も同結果の分岐を挟まないとか、 Vector を使うとかっていう最適化の基本的なところから、エンコード毎に使う PNG シグネチャ・ IEND チャンク・ CRC テーブルを定数にして使い回したりだとか、何度も同結果の null チェックしないとか、無駄な型変換をしないとかそんな感じ。
サイズや透明・不透明によって違うけど、だいたい 25% くらい高速化してる気がする。


About this entry