Optimized PNGEncoder
Alchemy – asynchronous jpeg encodingで OptimizedJPGEncoder や AlchemyJPGEncoder の処理速度比較をみて、 PNGEncoder も多少最適化できるかなと思ったんでやってみた。
PNGフォーマットはJPGフォーマットのように複雑な変換処理がない単純なフォーマットなので、コード量が少く最適化箇所も少ない。ただ、複数回エンコードしたり、サイズの大きな BitmapData をエンコードする際にはメリットがでてくるんじゃなかろーかと。
処理速度比較の為に as3corelib の PNGEncoder と同じく PLTE チャンクは実装せず、フィルタオプションは ‘None’ 一択で実装してる。 as3corelib にはない機能で、 BitmapData が不透明時の分岐を実装した。これをしとくことで BitmapData.transparent == false の BitmapData をエンコードした時にファイル容量が軽くなるはず。
最適化箇所をざっくり挙げとくと、 for 文の length をあらかじめ取得しとくとか、 for 文の中で何度も同結果の分岐を挟まないとか、 Vector を使うとかっていう最適化の基本的なところから、エンコード毎に使う PNG シグネチャ・ IEND チャンク・ CRC テーブルを定数にして使い回したりだとか、何度も同結果の null チェックしないとか、無駄な型変換をしないとかそんな感じ。
サイズや透明・不透明によって違うけど、だいたい 25% くらい高速化してる気がする。
About this entry
You’re currently reading “Optimized PNGEncoder,” an entry on jp.ferv.blog
- Published:
- Thu, Jan 7th, 2010 at 3:44 AM
- Author:
- dsk
- Category:
- Web
- Tags:
- ActionScript 3.0, FileFormat, PNGEncoder
No comments
Jump to comment form | comments rss | trackback uri