[AS3] Starling Wikiで紹介されたActionScript 3.0最適化のコツ [Edit]

Starling Wikiに「Performance Optimization」(パフォーマンスの最適化)という記事が掲載されました。記事の最後の項目は「ActionScript Tips」と題して、StarlingフレームワークにかぎらないActionScript 3.0の最適化のコツを解説しています。それらをご紹介しながら、コメントを加えてみます。

ループ処理

まず、配列などのオブジェクトからすべての値を取出す、繰返し処理についてです。for each..inステートメントは処理が遅いので、できるだけ避けましょう。forステートメントで、カウンタ変数を用いる方が速いです。

forステートメントの継続条件は、ループするごとに確かめられます。したがって、プロパティ(Array.lengthなど)を直に定めるのではなく、予め変数に入れておくと速さが稼げます。

// 遅い:
for each (var item:Object in array) { /* ...[中略]... */ }
 
// 速い:
for (var i:int = 0; i < array.length; ++i) { /* ...[中略]... */ }
 
// もっとも速い:
var length:int = array.length;
for (var i:int = 0; i < length; ++i) { /* ...[中略]... */ }

配列エレメントを取出すforループの最適化については、gihyo.jp連載「ActionScript 3.0で始めるオブジェクト指向スクリプティング」第56回「【特別編】配列エレメントすべてをforループで扱う」の「配列エレメントをforループで取出す」でつぎのようなポイントを掲げました。詳しくは、この解説をお読みください。

    配列エレメントを取出すforループの最適化
  • 配列インデックスとカウンタ変数は整数型(int/uint)で指定
  • 継続条件に用いるArray.lengthプロパティは予め変数にとる
  • 取出したエレメントは型指定した変数に入れる

オブジェクトを使い回す

すぐに要らなくなるオブジェクトを、いくつも新たにつくることは避けましょう。オブジェクトの参照をなくしても、ガベージコレクションが働くまでメモリは開放されないからです。

// 悪い:
for (var i:int = 0; i < 10; ++i) {
    var point:Point = new Point(i, 2 * i);
    doSomethingWith(point);
}
 
// よい:
var point:Point = new Point();
for (var i:int = 0; i < 10; ++i) {
    point.setTo(i, 2 * i);
    doSomethingWith(point);
}

なお、Point.setTo()メソッドは、Flash Player 11から備わりました。Starlingフレームワークを使わない場合には、まだFlash Player 10以前で書出すことも多いでしょう。そういうときは、Pointオブジェクトの座標値をプロパティで書替えます。前出gihyo.jp連載第58回「【特別編】ビットマップのキャッシュとオブジェクトの使い回し」の「オブジェクトを使い回す」にその例をご紹介しました。

この項目についてさらに詳しくは、「オブジェクトを使い回す」をお読みください。また、Starlingフレームワークの実装にも、オブジェクトの使い回しは用いられています。その例としては、「starling.events.Touchクラスと座標の変換」の「実装」の項(とくに注[*1])をご参照ください。

配列やVectorのインデックスは整数型で渡す

配列やVectorインスタンスにエレメントのインデックス番号を式で与えるとき、配列アクセス演算子[]に式をそのまま書込むのでなく、整数型(intまたはuint)に変換しましょう。

// 悪い:
var element:Object = array[10 * x];
 
// よい:
var element:Object = array[int(10 * x)];

この点については、以前「配列のインデックスを式で計算したときはuint型で渡す」で解説しました。

コメント

この記事にコメントを書く

記事に対するテクニカルな質問はご遠慮ください(利用規約)。

その他の記事