« ActionScript 天下一武道会 !! | メイン | WCAN mini AS vol.13『Progression特集』で発表してくれる人募集してます »

AS3でデータ圧縮するならZipのライブラリよりByteArray.compress

del.icio.us it!   hatena bookmark
Flashで大きめのデータを扱うときに、圧縮したいことなんかがあるんだけど、とりあえず思いつくのがZIPのライブラリ。以前ちょっと紹介したりしました。

ActionScript 3.0 でZIPの圧縮と解凍 (Unknown Quality)
http://un-q.net/2009/06/actionscript_30_zip_as3.html

上のエントリーにも書いたんだけど、解凍が結構時間かかる。そんなときはByteArrayクラスのcompressメソッドがおすすめ。

こんな風に使えます。
var data:ByteArray = new ByteArray();
data.writeUTF("hogehogehoegho.....");
data.compress() // 圧縮
data.uncompress() // 解凍

たとえばcollada形式の3Dモデルデータを読み込むときなんかに使えます。colladaはXML形式のデータなので圧縮すると結構容量が減ります。まずcolladaのXMLをFlashに読み込みByteArrayにしてcompressして、それをファイルとして保存してしまいます。コンテンツではその保存したデータを読み込んでuncompressして使う感じです。

こんな感じで読み込み用のデータを作ります。
// URLLoaderでcolladaのデータを読み込む
// ここはURLLoaderのEvent.COMPLETEハンドラ内
// _loaderがURLLoader
var b:ByteArray = new ByteArray();
b.writeUTFBytes(_loader.data); // _loader.dataにcolladaのXMLデータ
b.compress();
stage.addEventListener(MouseEvent.CLICK, function(e:MouseEvent):void {
    var file:FileReference = new FileReference();
    file.save(b, "filename.dat");
});

ちなみに7MBほどのデータを処理したときの結果。解凍の速度が圧倒的に違います。
※ZIPのライブラリはnochump.util.zipの物を使ってます。
start zip compress
end zip compress 1877ms

start zip uncompress
end zip uncompress 3736ms

start ByteArray compress
end ByteArray compress 1178ms

start ByteArray uncompress
end ByteArray uncompress 36ms
画像のデータとかはあまり圧縮できないですね。ZIPでもそれは同じだと思います。あと圧縮率はテキストの場合ZIPでもByteArrayのcompressでも大きな差はありませんでした。

[追記]
ZIP圧縮と圧縮率が変わらないのは、FlashPlayerでのcompressはzlibのアルゴリズムを使ってるからです。AIRだと圧縮のアルゴリズムを変更することが出来ます。詳しくはドキュメント読んでください。
ByteArray - ActionScript 3.0 言語およびコンポーネントリファレンス


Flash Math & Physics Design:ActionScript 3.0による数学・物理学表現[入門編] 集合知プログラミング ビジュアライジング・データ —Processingによる情報視覚化手法 御岳百草丸 1200T

トラックバック

このエントリーのトラックバックURL:
http://un-q.net/mt-tb.cgi/411

コメントを投稿

書いたよ!