2010年9月9日木曜日

Flexの高速PNGエンコーダーを求めて - Blooddy氏のPNG24Encoder(たぶんAlchemy非使用)

FlexでPNGをエンコードするとなれば、普通は標準APIのmx.graphics.codec.PNGEncoderを使うことになるだろう。しかし、JPEGの場合と同様、まだ十分に速いとは言えない。そこでより高速なエンコーダーを探すことになる。

琴線探査: Flexの高速JPEGエンコーダーを求めて - metalbot氏のアレ(Alchemy利用)

まず行き着いたのが、Spark Projectにコミットされているjp.ferv.blog氏の「PNG クラス」だ。こちらのライブラリもAlchemyを利用しているらしい。
dsk/PNG - Spark project

実際に利用してみると、ご本人もおっしゃるっているように、残念ながらAlchemyを利用することで期待するスピードは出ていないようだった。

jp.ferv.blog >> Blog Archive >> Alchemy PNG encoder を Spark

自分の環境でテストするとこんな感じだった。

mx.graphics.codec.PNGEncoder
480x854, 890.18KB, 1.18sec
1600x1200, 4,072.90KB, 5.15sec

jp.ferv.fileformats.png.PNG
480x854, 759.36KB, 1.01sec
1600x1200, 3,220.01KB, 4.25sec

標準のAPIに比べて20%程度高速で、特に非同期エンコードもできるというメリットは見逃せない。

さらにjp.ferv.blog氏のブログを拝見していると、このような記事が。
jp.ferv.blog >> Blog Archive >> 最速 PNGEncoder を教えてもらったよ

この記事には各種PNGEncoderの速度比較をしている記事へのリンクがある。それはこちらだ。
Quick tip: Fastest ActionScript PNGEncoder at Jozef Chúťka's blog

結論としてはBlooddy氏のPNG24Encoder圧倒的に速いということが書かれている。

ということで、Blooddy氏のサイトからライブラリをダウンロードさせて頂いた。MITライセンスで提供されている!ありがたや。Blooddy氏はどうやらロシアの方らしい。
BlooDHoun's workspace

ダウンロードしたアーカイブにはMITライセンスのテキストとSWCのみが入っていて、使い方がまったくわからない(^^);

しかし、Blooddy氏のお友達らしい方のポストにこのライブラリのテストコードがあったので大体のことはわかった。PNGのエンコーダーだけでなく、JPEGやMD5のエンコーダーも含まれているようだ。
100x times faster MD5 and more >> Valentin Simonov's Flash Blog

自分の環境でテストするとこんな感じだった。

mx.graphics.codec.PNGEncoder
480x854, 890.18KB, 1.18sec
1600x1200, 4,072.90KB, 5.15sec

jp.ferv.fileformats.png.PNG
480x854, 759.36KB, 1.01sec
1600x1200, 3,220.01KB, 4.25sec

by.blooddy.crypto.image.PNG24Encoder
480x854 890.23KB, 0.43sec
1600x1200, 4,072.95KB 1.68sec

確かに速い!爆速だ。標準のPNGEncoderの3倍近く高速だ。非同期エンコードのインターフェースは見当たらなかったけれど、これだけ速ければ非同期の必要性は感じないかもしれない。

Alchemyを利用しているのかどうかはわからないけれど、SWCのファイルサイズがわずか16KBであることを考えると、恐らくAlchemyは利用していないのではないかと思われる。

しかし、たった16KBでこれだけのことができるとは!すばらしい。Thanks, Blooddy!