Upload
andy-hall
View
3.282
Download
3
Embed Size (px)
DESCRIPTION
60fpsへの道:Flashゲームにおけるパフォーマンスチューニングの A to Z
Citation preview
© 2012 Adobe Systems Incorporated. All Rights Reserved.
60fpsへの道: Flashゲームにおける
パフォーマンスチューニングの A to Z
Andy Hall Adobe Japan
© 2012 Adobe Systems Incorporated. All Rights Reserved.
Andy Hall Game Evangelist
Adobe Japan
アンディ ホール ゲーム エバンジェリスト アドビ システムズ 株式会社 @fenomas
© 2012 Adobe Systems Incorporated. All Rights Reserved.
Agenda
• 最適化の全体的な話 • ActionScript 3.0 最適化 • Flash Player 内部設計 • レンダリング最適化 • 今後のトピック
© 2012 Adobe Systems Incorporated. All Rights Reserved.
最適化の原則
“Premature optimization is the
root of all evil” Donald Knuth
(早すぎる最適化は諸悪の根源)
© 2012 Adobe Systems Incorporated. All Rights Reserved.
最適化の流れ
パフォーマンス 向けの設計作り
効率よく、 迅速に開発
最適化 (ボトルネックのみ)
© 2012 Adobe Systems Incorporated. All Rights Reserved.
Metrics
最適化の前には測定基準が必要。
• FPS • メモリー使用量 • CPU 使用率 • Bandwidth? • バッテリー消費 • etc...
© 2012 Adobe Systems Incorporated. All Rights Reserved.
プロファイリング
現在: Flash Builder 4.6 プロファイラー
近未来: コードネーム「モノクル」
© 2012 Adobe Systems Incorporated. All Rights Reserved.
ACTIONSCRIPT 最適化
© 2012 Adobe Systems Incorporated. All Rights Reserved.
ActionScript 3.0 の最適化
注意: • レンダーリングの方が
ネックの場合が多い
• 良く見る最適化の 「コツ」は多くの場合 無視しましょう
© 2012 Adobe Systems Incorporated. All Rights Reserved.
基本の基本
• AS3.0 は必須 • すべての変数に型付け • Array、Dictionaryより
Vector.<type> • RegExpよりStringメソッド • E4X、XML は要注意
( ) • イベントよりコールバック
常に!
ネック の場合
© 2012 Adobe Systems Incorporated. All Rights Reserved.
Pooling
インスタンス化のコストが高い! オブジェクトのプール、再利用で、インスタンス化と 処理のコストを抑える
• Static temps
• オブジェクト pooling
© 2012 Adobe Systems Incorporated. All Rights Reserved.
Function コール
ファンクションコールにもコストそこそこ。 コールスタックを浅く、再帰的定義を避けよう。
© 2012 Adobe Systems Incorporated. All Rights Reserved.
ガベージコレクション
GCを良く知ろう!
• Flash のGCは参照カウント、 マーク・スイープを 両方実装している。 (メモリー使用量の最適化には上記の理解が絶対条件!)
• モノクルを利用して、GC発生の頻度をチェックしよう。 • プール、再利用してGCの発生を抑えよう。 • リテラル(String、intなど)はヌルにするだけで処理
が済むので、大量データをリテラルとして扱おう。
© 2012 Adobe Systems Incorporated. All Rights Reserved.
GCをスマートに
GCの都合の良いタイミングをFlashに教えよう。
画面切り替え、ポーズ画面等で上記を呼ぼう。 FlashのGC処理の準備は徐々に進んでいる。上記コマンドでは、 今のタイミングで処理するようにFlashに指示する。 因数は緊急性を表す。 imminence=0.99; // すぐに処理ができれば発生させる imminence=0.01; // 処理の準備がまだ多少残っても発生させる
© 2012 Adobe Systems Incorporated. All Rights Reserved.
参考文献:
「ActionScript 3.0 パフォーマンスチューニング」 (野中 文雄 著)
© 2012 Adobe Systems Incorporated. All Rights Reserved.
FLASH 内部設計
© 2012 Adobe Systems Incorporated. All Rights Reserved.
全体像 // フラッシュの内部ループ(単純的に) while() { sleep until (nextEvent OR externalEvent) if ( various events pending ) { handleEvents(); // Timerイベント、 // audio/video バッファー等を処理する } if ( time for next SWF frame ) { parseSWFFrame(); executeActionScript(); } if ( screen needs update ) { updateScreen(); } }
© 2012 Adobe Systems Incorporated. All Rights Reserved.
Flash の内部ループ
外部からの イベント処理
次のSWF フレームを処理 スクリプト実行
レンダー (表示)
sleep
© 2012 Adobe Systems Incorporated. All Rights Reserved.
ポイント! 定期的な処理は基本的に
Event.ENTER_FRAME で!
sleep
ENTER_FRAME
外部からの イベント処理
次のSWF フレームを処理 スクリプト実行
レンダー (表示)
© 2012 Adobe Systems Incorporated. All Rights Reserved.
表示リスト
Display List
Bitmap Video
Vector shapes
© 2012 Adobe Systems Incorporated. All Rights Reserved.
再描画領域
Display List フレーム アップデート
“Dirty” (再描画される)
© 2012 Adobe Systems Incorporated. All Rights Reserved.
表示プレーン
Display List
3D Video
Vector
© 2012 Adobe Systems Incorporated. All Rights Reserved.
描画モード
wmode (Flash ) renderMode ( AIR)
direct
transparent opaque
ブラウザー
CPU
GPU
Flash レンダリング
gpu
cpu
© 2012 Adobe Systems Incorporated. All Rights Reserved.
レンダリング 最適化
© 2012 Adobe Systems Incorporated. All Rights Reserved.
Rendering 基本
• 表示リストを浅くしよう。
理由:再描画領域内 のすべてが 毎フレーム完全に 処理されるため
Display List
© 2012 Adobe Systems Incorporated. All Rights Reserved.
Rendering 基本
ある表示機能は物理的に重い。 気を付けながら使おう。 • ビットマップエフェクト
(グロー、ドロップシャドー等) • マスク(ベクターベースだし) • アルファーチャンネル・半透明 • ブレンドモード(add、multiply等) • 組み込みフォント(特に日本語!)
© 2012 Adobe Systems Incorporated. All Rights Reserved.
Rendering 基本
• 用が済んだものはStageから消去 • 適切なフレームレートを • ベクターシェイプを簡単化しよう
© 2012 Adobe Systems Incorporated. All Rights Reserved.
Stage設定 • StageQuality.LOW:
Lower-quality vector shapes. Never anti-alias, never smooth bitmaps.
• StageQuality.MEDIUM: Better vectors. Some anti-aliasing but no bitmaps smoothing. Default value for mobile devices.
• StageQuality.HIGH: Always uses anti-aliasing. Uses smoothing on bitmaps depending on whether the SWF is animating. Default value on desktop PCs.
• StageQuality.BEST: Best quality. Always anti-alias, always smooth bitmaps.
© 2012 Adobe Systems Incorporated. All Rights Reserved.
Rendering 内部設計
• ラスタライズ化の条件、 ビットマップキャッシュは デザイナーさんも含めて理解しよう!
© 2012 Adobe Systems Incorporated. All Rights Reserved.
Bitmap Caching
• 複雑なアセットを 一度ラスタライズして 後はビットマップが 代わりに使われる。
• ビットマップエフェクト、ブレンドモード等を 利用する場合に自動的に適用
一般的なFlashコンテンツの最適化には、 これは何より大事!
© 2012 Adobe Systems Incorporated. All Rights Reserved.
再ラスタライズの条件 foo.cacheAsBitmap = true;
foo.cacheAsBitmapMatrix = new Matrix();
キャッシュ のまま
再ラスタライズ
キャッシュのまま GPUで描画される AIRアプリのみ!
© 2012 Adobe Systems Incorporated. All Rights Reserved.
Bitmap Caching
キャッシュ状態をモノクルで確認しよう。
© 2012 Adobe Systems Incorporated. All Rights Reserved.
Rendering 最適化
最後の一言: 現場のスペックに合わせよう!
500 particles 200 particles
© 2012 Adobe Systems Incorporated. All Rights Reserved.
レンダリング モデル
© 2012 Adobe Systems Incorporated. All Rights Reserved.
Rendering Models
現代のゲームに、 レンダーモデルは主に4つ:
1. Display List 2. GPU mode 3. Blitting 4. Stage3D
© 2012 Adobe Systems Incorporated. All Rights Reserved.
1.表示リストモデル
• Flash Proアニーメータが作る、タイムライン
アニーメーションベースの一般的なコンテンツ
• 作りやすい。パフォーマンスは低い。
• PC向けの軽いコンテンツには十分に使える。
モバイルにはNG。(GPU一切使われないし)
• 最適化のキーテクニックはビットマップ
キャッシュである。
© 2012 Adobe Systems Incorporated. All Rights Reserved.
2.GPU Mode
• AIRアプリのパブリッシュ設定である。
Android、iOSにも対応する。
• 設定の場合、ベクターやビットマップをGPU経由で
描画しようとする。
• movieclip.cacheAsBitmapMatrix を正しく、注意深く
使えば、かなりパフォーマンスが出る。
• 現代までは有力なモデルだが、今後の作品・
新プロジェクトにはおすすめできない。
© 2012 Adobe Systems Incorporated. All Rights Reserved.
GPU Mode 事例 モンスタープラネットSMASH!
(GREE)
参考:
© 2012 Adobe Systems Incorporated. All Rights Reserved.
3.Blitting(ブリット)
• StageにBitmapを置いて、自分で扱うビットマッ
プデータをBitmapData.copyPixels()で
ゲームエリアに手動的に描く。
• つまり、レンダリングを完全に自分で担当。
• 固い条件が満たされる場合、効果的である。
• 解像度の高い(Retina)画面には
スケールしないので寿命が…
© 2012 Adobe Systems Incorporated. All Rights Reserved.
4. Stage3D
© 2012 Adobe Systems Incorporated. All Rights Reserved.
4.Stage3D
• Flash 11.0からの新機能。ActionScriptから
シェーダープログラムを直接GPUに送れる。
• AGAL (Adobe Graphics Assembly Language) を利用する
• AGAL とはこんな感じ:
• 一般的な開発者には
ライブラリーが必要!
m44 op, va0, vc0 dp4 op.x, va0, vc0 dp4 op.y, va0, vc1 dp4 op.z, va0, vc2 dp4 op.w, va0, vc3 m44 op, va0, vc0 mov v0, va1
(ヒトリデハキケンジャ!)
© 2012 Adobe Systems Incorporated. All Rights Reserved.
• オフィシャルライブラリー (free, open source):
• Starling (2D)
• Away3D
• ニーズによって他にも様々…
N2D2 Genome2D
Stage3D ライブラリー ( コレヲ サズケヨウ!)
© 2012 Adobe Systems Incorporated. All Rights Reserved.
Stage3D 事例
© 2012 Adobe Systems Incorporated. All Rights Reserved.
今後のトピック
© 2012 Adobe Systems Incorporated. All Rights Reserved.
AS3 ワーカー
作成
MessageChannel
API
共用メモリー
メイン ワーカー
(既存
Flash Player)
バックグラウンド ワーカー
(制限付き)
mutex
© 2012 Adobe Systems Incorporated. All Rights Reserved.
AS3 ワーカー
作成
MessageChannel
API
共用メモリー
メイン ワーカー
(既存
Flash Player)
バックグラウンド ワーカー
(制限付き)
mutex
© 2012 Adobe Systems Incorporated. All Rights Reserved.
Longer term
新コンパ イラー!
プロジェクト モノクル
Flash Proを より進化!
ActionScript の次版・・?
© 2012 Adobe Systems Incorporated. All Rights Reserved.