- 2009年11月18日 (水)
- Tweet
wonderflから学ぶActionScript 3.0最適化
いつも勉強になる_level0.KAYACさんのブログでイベント告知(ごはんとFlash -Its a wonderfl rice-)がありましたが、皆さん詳細をチェックしましたか? ライブコーディングというその場でActionScript 3.0を書いて課題のFlashを作るという企画もあるのですが、私も参戦します。果たして30分で作り上げることができるのか、今から緊張します。
さて、前置きが長くなりましたが、wonderflで検証されたActionScript 3.0最適化手法をまとめてみました。詳細は以下から。
Bitmap関連
Flashの処理速度の最適化において、描画処理の最適化は最も効果があります。ここではスクリプトで高速化した検証結果をまとめてみました。
BitmapDataクラスのdraw()とcopyPixels()だとcopyPixels()のほうが160%高速。
BitmapDataのチャネルを入れ替える際は、BitmapData.copyChannel()よりColorMatrixFilterを使うほうが180%高速。
ベクターのグラフィックスをビットマップデータとしてキャッシュしておくと非常に高速。下記の例では同じ1000個の要素にすると230%高速。
BitmapDataをループ文で更新するときは、lock()・unlock()を使うと200%高速。
ビルドインの計算より数値計算/if文のほうが高速
Point.distanceと数値計算では、数値計算のほうが490%高速。
Math.absとMath.min、Math.maxなどはif文で計算するほうが高速。if文を使うと1100%高速。
配列の最適化TIPS
Arrayのshift()とunshift()は非常に重いので(5000%?)、「unshift は使わずに push したものを reverse」すると良い。
Array.RETURNINDEXEDARRAYを使ってインデックス配列を作ると結構遅い
AS3ネイティブのソートより、シェルソートというアルゴリズムを使ったほうが400%高速(要素10000個の配列で)
※追記:ネイティブソートの場合、ソート条件(Array.NUMERIC)を指定すると遅くならないみたいです(via : uwi)
数値の型
uintとintでは、基本的にはほぼ同速度。加算(i++)の際にuintのほうが120%高速 (1千万回ループで)。
ループ処理
アンロールという手法を使うと、forのループ文を高速化できるというTIPS。
Progression関連
SerialListを使うよりもParallelListを使って読み込むほうが、高速に読み込むことができる(20個の画像ファイルで600%高速)。ただしParallelListを使った場合は同時リクエストを発行することになりサーバーへの負荷上よろしくないので、使用は適切に判断する必要がある。
※ブラウザの同時リクエスト制限数の挙動に似た、上限付き並列読み込みの拡張機能として私のほうで作っています。(リンク)
他にも抑えておきたい最適化TIPS
以前、unbland.org blogさんが「ActionScript の最適化 Tips を wonderfl に投稿しました」という検証記事を掲載されてましたので、そちらとあわせて読むと様々な手法を知ることができます。ArrayやObjectの書き方を変更するだけで高速化するとかは、読みやすさにも影響するので抑えておきたいですね。
var arr:Array = new Array(); var obj:Object = new Object();
↓のほうが高速
var arr:Array = []; var obj:Object = {};
こちらの記事も少し古いですが参考になります。
2009年11月19日(木) 05:51
[…] ・Array、ByteArray、 Vector、比較。 ・wonderflから学ぶActionScript 3.0最適化 ・ActionScript3 最適化・高速化Tips 簡易まとめ AS3.0 […]
2009年11月19日(木) 09:33
[…] >>clock makerさん ・ベクターグラフィックスをBitmapに格納しておくと高速.230%!! […]
2010年05月01日(土) 12:03
[…] wonderflから学ぶActionScript 3.0最適化 | ClockMaker Blog […]
2011年03月11日(金) 16:01
[…] wonderflから学ぶActionScript 3.0最適化 | ClockMaker Blog (tags: ActionScript Flash 高速化 Programming Tips) […]