wonderflから学ぶActionScript 3.0最適化

091118-wonderfl-optimize

いつも勉強になる_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 = {};

こちらの記事も少し古いですが参考になります。

投稿者 : 池田 泰延

BookMark

ブックマークはこちらからどうぞ。

このエントリーをはてなブックマークに追加

Comment/Trackback 4件