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 (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インスタンスにエレメントのインデックス番号を式で与えるとき、配列アクセス演算子[]に式をそのまま書込むのでなく、整数型(intまたはuint)に変換しましょう。
// 悪い: var element:Object = array[10 * x]; // よい: var element:Object = array[int(10 * x)];
この点については、以前「配列のインデックスを式で計算したときはuint型で渡す」で解説しました。