読者です 読者をやめる 読者になる 読者になる

ひつじのにっき

mhidakaのにっきです。たまに長文、気が向いたとき更新。

プロファイリングで高速ポリゴン描画を目指せ!

Android

エモーションプラス EMOTIONPLUS 代表 原 秀樹さん

3Dグラフィックスの基礎知識がある前提ですが、
高速化のためのノウハウをみっちり味わえます。
TraceViewによるパフォーマンスチューニングは、
アプリケーションのボトルネック解析にとても有効です。

Ustreamはこちら25分ぐらから。http://www.ustream.tv/recorded/6930738

描画処理について

  • OpenGLは2D/3Dどちらでも利用可能
  • 基本は2点。座標変換の計算処理とポリゴン描画処理

高速、大量に行うことで画面を作る(定期的に実施)

手順

  1. 頂点バッファ作成、データバッファに格納
  2. マトリクス、レンダリングステートを設定
  3. 描画を実行を必要分繰り返す
  4. ダブルバッファをスワップする

デモプログラム

  • 動作デモ:テクスチャがはられた立方体が動く(チューニング前)
  • GSSerfaceView 32枚のテクスチャ利用

テクスチャアニメーション処理

  • ポリゴンに張り付けるテクスチャの座標を変化、アニメーションを行う
  • 2DゲームもOpneGLで行えばCanvasよりも若干高速

きれいな画面にしたい

  • よりたくさんのポリゴンを描画したい。
  • 高速化=無駄な処理を省く

処理のどこかに負荷がかかる部分がある。
重たい部分を特定する方法がプロファイリング

プロファイリング

  • メソッドの処理時間を収集、性能を解析する
  • TraceViewというツールを使って簡単にプロファイリングが行える

ボトルネックを特定

トレースの時間は4秒ぐらいしかない
Debugクラスを使って計測期間を指定

開始 Debug.startMethodTracing("normal.trace");
終了 Debug.stopMethodTracing();
  • adb Pullして、 TraceViewでトレースができる
  • TraceViewの使い方 スレッドが動く様子が一目でわかる。
  • 1回の描画ループが330msかかっている(チューニング前)

→ FloatBufferへのPutメソッドが処理時間がかかっている。
テクスチャ座標の書き換え処理のほうが時間かかる

パフォーマンスチューニング

  • Putメソッドでバッファ切り替え方式に変更した新しいデモプログラム

トレースして表示すると差がよくわかる。150msにまで(倍以上に)スピードアップ。
テクスチャアニメーション バッファを座標で書き換えるとパフォーマンスが遅くなる
書き換えではなくて事前にIndexとして保持。

  • 固定小数点のほうが速い
  • CPUとGPUが並列で動くので描画処理をやりながらゲーム処理を走らせてパフォーマンスを上げるフローを作る。