[AS3] パフォーマンス向上のヒント [Edit]

12月4日土曜日に開かれたFITC Tokyo 2010で、Mike Chambers氏は「Flashで作成する高性能モバイルコンテンツ」と題するプレゼンテーションをされました。その中で使われたスライドは、多くがすでに公開されているFITC Amsterdam 2010のPDFと共通するようです。

そこで、とくにFlashコンテンツのパフォーマンス向上に関わる部分を、筆者の興味にしたがって若干の加筆・補正も含みつつ抜出してみました。なお、ActionScript 3.0におけるパフォーマンス向上の基本については「ActionScript 3.0におけるパフォーマンス向上のヒント」をご参照ください。

*ページ番号は、Mike Chambers氏のPDFによる。

  1. レンダリング(p.31、34)
  • ハードウェア合成のレンダリングはDisplayObjectに使われる
  • ソフトウェアレンダリングは画面全体をソフトウェアで描く
  • GPU合成
    • 各エレメントはソフトウェアでレンダリング
    • 全体をハードウェアで合成する
  • GPU合成を使うには(p.36、38)
    • cacheAsBitmapをtrueに設定
      • 変換行列による平行移動
      • x/yプロパティの変更
      • トゥイーン
    • cacheAsBitmapMatrixにMatrixオブジェクトを設定 (モバイルAIR専用)
      • 行列による座標変換
      • 回転
      • 伸縮
    • 2.5Dの操作を行う
      • 例) zプロパティの設定
  • 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)
    • 不要なときは無効にする
      • mouseEnabledをfalseに設定
      • mouseChildrenをfalseに設定
      • MouseEvent.MOUSE_MOVEを使わない
        • 時間間隔を定めてポインタの位置を調べる
        • Event.ENTER_FRAMEイベントの利用

    コメント

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

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

    その他の記事