[AS3] パフォーマンス向上のヒント [Edit]
投稿者:野中 文雄 | 投稿日:2010.12.05 | [AS 3][Tips][野中ゼミ]
12月4日土曜日に開かれたFITC Tokyo 2010で、Mike Chambers氏は「Flashで作成する高性能モバイルコンテンツ」と題するプレゼンテーションをされました。その中で使われたスライドは、多くがすでに公開されているFITC Amsterdam 2010のPDFと共通するようです。
そこで、とくにFlashコンテンツのパフォーマンス向上に関わる部分を、筆者の興味にしたがって若干の加筆・補正も含みつつ抜出してみました。なお、ActionScript 3.0におけるパフォーマンス向上の基本については「ActionScript 3.0におけるパフォーマンス向上のヒント」をご参照ください。
*ページ番号は、Mike Chambers氏のPDFによる。
- レンダリング(p.31、34)
- ハードウェア合成のレンダリングはDisplayObjectに使われる
- ソフトウェアレンダリングは画面全体をソフトウェアで描く
- GPU合成
- 各エレメントはソフトウェアでレンダリング
- 全体をハードウェアで合成する
GPU合成を使うには(p.36、38)
GPUを使おう(p.42)
- ハードウェアアクセラレーションは基本的にすべてに有効
- 再描画を最小限にするためにDisplayObjectを分ける
- 子インスタンスが動いたり変わったりするMovieClipはキャッシュしない
- 表示リストは浅くする(DisplayObjectの入れ子を少なく)
再描画の要因を避ける(p.43)
- キャッシュされていないDisplayObjectの上を動かす
- 表示内容を書替える
- Drawing APIの使用
- 子インスタンスの移動・変更
- ColorTransformクラスを適用する
- 表示リストから除く
インスタンスをつくるのは最小限に(p.44)
- オブジェクトインスタンスは使い回す
- メモリ割当は負荷が高い
- ガベージコレクションを減らす
- CPUと初期化の負荷を減らす
オブジェクトプール(p.50)
- オブジェクトインスタンスを使い回す
- 初期化とガベージコレクションの繰返しを避ける
- DisplayObjectのプールはとくにGPU合成で役立つ(p.51)
- キャッシュされたDisplayObjectを使い回す
- ステージに置いたまま(隠すときはステージ外)
- パフォーマンスは大きく高まる
参考: Object Pool「Strategic Choice」
時間間隔の管理(p.53)
- 一般にENTER_FRAMEの方がTimerより効率がよい
- リスナーはひとつにして他を呼出す
イベントの配信(p.54)
- 負荷が高くなりがち
- そのためのメモリ割当がいくつか必要になる
- CPU負荷の高い場面ではコールバックを使ってみる
- Eventインスタンスの使い回しも考える
イベントの伝播(p.56)
マウス/タッチイベント(p.58)