エモーションプラス EMOTIONPLUS 代表 原 秀樹さん
3Dグラフィックスの基礎知識がある前提ですが、
高速化のためのノウハウをみっちり味わえます。
TraceViewによるパフォーマンスチューニングは、
アプリケーションのボトルネック解析にとても有効です。
Ustreamはこちら25分ぐらから。http://www.ustream.tv/recorded/6930738
描画処理について
- OpenGLは2D/3Dどちらでも利用可能
- 基本は2点。座標変換の計算処理とポリゴン描画処理
高速、大量に行うことで画面を作る(定期的に実施)
手順
- 頂点バッファ作成、データバッファに格納
- マトリクス、レンダリングステートを設定
- 描画を実行を必要分繰り返す
- ダブルバッファをスワップする
デモプログラム
- 動作デモ:テクスチャがはられた立方体が動く(チューニング前)
- GSSerfaceView 32枚のテクスチャ利用
テクスチャアニメーション処理
- ポリゴンに張り付けるテクスチャの座標を変化、アニメーションを行う
- 2DゲームもOpneGLで行えばCanvasよりも若干高速
きれいな画面にしたい
- よりたくさんのポリゴンを描画したい。
- 高速化=無駄な処理を省く
処理のどこかに負荷がかかる部分がある。
重たい部分を特定する方法がプロファイリング
プロファイリング
- メソッドの処理時間を収集、性能を解析する
- TraceViewというツールを使って簡単にプロファイリングが行える
ボトルネックを特定
- プログラムでトレースの開始/終了をメソッドで設定
- AndroidManifestにSD書き込み権限のパーミッションを追加
トレースの時間は4秒ぐらいしかない
Debugクラスを使って計測期間を指定
開始 |
Debug.startMethodTracing("normal.trace"); |
終了 |
Debug.stopMethodTracing(); |
- adb Pullして、 TraceViewでトレースができる
- TraceViewの使い方 スレッドが動く様子が一目でわかる。
- 1回の描画ループが330msかかっている(チューニング前)
→ FloatBufferへのPutメソッドが処理時間がかかっている。
テクスチャ座標の書き換え処理のほうが時間かかる
パフォーマンスチューニング
- Putメソッドでバッファ切り替え方式に変更した新しいデモプログラム
トレースして表示すると差がよくわかる。150msにまで(倍以上に)スピードアップ。
テクスチャアニメーション バッファを座標で書き換えるとパフォーマンスが遅くなる
書き換えではなくて事前にIndexとして保持。
- 固定小数点のほうが速い
- CPUとGPUが並列で動くので描画処理をやりながらゲーム処理を走らせてパフォーマンスを上げるフローを作る。