DeviceCentral

トピック参照先:

モバイルデバイスの Flash Lite コンテンツ向けに ActionScript を最適化

ほとんどのモバイルデバイスには処理速度とメモリの制限があるため、モバイルデバイスで使用する Flash Lite コンテンツ向けに ActionScript を開発する場合、次のガイドラインに従います。

  • ファイルとコードをできるだけ単純にします。 使用されていないムービークリップや、不要なフレームとコードのループを削除し、フレームが多すぎたり無関係なフレームが含まれることのないようにします。

  • FOR ループを使用すると、条件が繰り返し確認される際にオーバーヘッドが発生するため、処理が遅くなる可能性があります。 条件確認が繰り返されることによりループによるオーバーヘッドが問題になる場合、ループを使用するのではなく、複数の操作を個々に実行します。 コードは長くなりますが、パフォーマンスは改善します。

  • フレームごとのループは、不要になったら直ちに停止します。

  • 文字列と配列の処理は CPU の使用率が高くなるため、できる限り避けます。

  • ActionScript の getter メソッドと setter メソッドは他のメソッドの呼び出しよりもオーバーヘッドが多いため、直接プロパティにアクセスするようにします。

  • イベントを適切に管理します。 イベントを呼び出す前にリスナが存在すること(null ではないこと)を確認する条件を使用して、イベントリスナの配列をコンパクトに保ちます。 clearInterval を呼び出してアクティブなインターバルをクリアし、removeListener を呼び出してアクティブなリスナを削除してから、unloadapplication または removeapplicationClip を使用してコンテンツを削除します。 Flash では、ムービークリップをアンロードするときに、ActionScript 関数が SWF データを参照している場合でも、SWF データのメモリは(インターバルやリスナなどから)再収集されません。

  • 変数が不要になった場合、削除するか null に設定してガベージコレクションに指定します。 変数を削除すると、不要なアセットが SWF ファイルから削除されるため、実行時のメモリ使用が最適化されます。 変数を null に設定するよりも、変数を削除する方が適切です。

  • removeListener を呼び出してオブジェクトからリスナを明示的に削除してから、ガベージコレクションを行います。

  • 関数を動的に呼び出し、固定のパラメータ群を渡す場合、apply ではなく call を使用します。

  • 名前空間(パスなど)を小さくして、起動時間を短縮します。 パッケージ内の全レベルを IF 文にコンパイルすると、新しく Object が呼び出されるため、パスのレベル数が減り時間が短縮されます。 例えば、com.xxx.yyy.aaa.bbb.ccc.funtionName というレベルのパスは、com.xxx.yyy.aaa.bbb.ccc にオブジェクトがインスタンス化されます。 Flash の開発者によっては、プリプロセッサソフトウェアを使用して、58923409876.functionName のようにパスを短くして一意な識別子にしてから、SWF コードをコンパイルします。

  • 同じ ActionScript クラスを使用する複数の SWF ファイルから構成されるファイルの場合、コンパイル時に選択する SWF ファイルからそのクラスを除外します。 こうすることで、ファイルのダウンロード時間と実行時のメモリ必要量を軽減できます。

  • Object.watchObject.unwatch を使用しないようにします。これは、オブジェクトプロパティを変更すると、プレーヤーが変更の通知を送信するかどうかを毎回判断する必要があるためです。

  • タイムラインのキーフレームで実行する ActionScript コードの完了時間が 1 秒を超える場合、コードを分割して複数のキーフレームで実行するようにします。

  • SWF ファイルを発行するときに、コードから trace 文を削除します。 この場合、パブリッシュ設定ダイアログボックスの「Flash」タブにある「Trace アクションを省略」チェックボックスを選択します。

  • 継承は、メソッドの呼び出し数を増加させ、より多くのメモリを使用します。実行時には、必要な機能をすべて含むクラスの方が、スーパークラスから一部の機能を継承するクラスよりも効率的です。 そのため、設計時には、クラスの拡張性とコードの効率性のバランスを考慮する必要があります。

  • SWF ファイルに、カスタムの ActionScript クラス(例えば foo.bar.CustomClass)を含む別の SWF ファイルをロードし、その SWF ファイルをアンロードすると、クラス定義がメモリ内に残ります。 メモリを節約するには、アンロードした SWF ファイルのカスタムクラスを明示的に削除します。 delete 文を使用し、delete foo.bar.CustomClass などの完全修飾クラス名を指定します。

  • グローバル変数の使用を制限します。これは、グローバル変数が定義されたムービークリップを削除しても、ガベージコレクションに指定されないためです。

  • Flash のコンポーネントパネルにある標準のユーザインターフェイスコンポーネントを使用しないようにします。 これらのコンポーネントは、デスクトップコンピュータで実行するように設計されており、モバイルデバイス用に最適化されていません。

  • できるだけ、関数の入れ子を深くしないようにします。

  • 存在しない変数、オブジェクト、関数を参照しないようにします。 デスクトップバージョンの Flash Player と比較すると、Flash Lite 2 では存在しない変数を参照する処理に時間がかかるため、パフォーマンスの大幅な低下につながります。

  • 匿名の構文を使用して関数を定義しないようにします。 例えば、myObj.eventName = function{ ...} です。 明示的に定義した関数の方が効率的です。例えば、function myFunc { ...}; my Obj.eventName = myFunc; のようにします。

  • Math 関数と浮動小数点の数を最小限に抑えます。 このような数値計算ではパフォーマンスが低下します。 Math ルーチンを使用する必要がある場合、値を事前に計算し、変数の配列に格納する方法もあります。 データテーブルから値を取得する方が、実行時に Flash で計算するよりもはるかに高速です。