Mac OSでPerfHUD ESを利用してNexus7のOpenGL ES負荷を測定する
いろいろあってヨドバシポイントを2万円分手に入れたので、検証機としてNexus7を購入しました。Nexus7はTegraを搭載していて、便利なツールがMacでも使えるので、そのメモです。
標準ツールでのOpenGL ESデバッグ
現在のAndroid SDKやADTはOpenGL ES用のトレーサーを提供しています。ですが、トレーサーにはいくつかの問題点があり、実際のアプリ開発では有効活用出来ない場合があります。
例えば、次のような問題点があります。
- 起動時にしか有効にできない
- リアルタイムのトレースが出来ない
- 基本的に呼出履歴の保存とフレームバッファの保存のみが行えるため、リアルタイム性が無い
- 内容はトレース停止後でしか確認できない
PerfHUD ESとは
PerfHUD ESはNVIDIA社が提供している、Tegra系列GPU専用のプロファイリングツールです。
端末のroot不要であり、adb経由でリアルタイムにCPU/GPUの処理内容をトレースすることができます。
また、アプリ起動中からのアタッチ・デタッチも自由に行えるため、標準ツール以上の自由度があります。
Nexus7はNVIDIA社のTegra3を搭載していますので、PerfHUD ESを利用することができます。(ちなみに、ESがつかないほうのPerfHUDはデスクトップ用GPU向けのようです)
ツール自体はNVIDIAのDeveloper登録が必要になりますが、無料で手に入れることができます。
接続方法
Windows版はUSBのWifi接続が可能ですが、Mac版はWifi接続のadb限定のようです。 また、アプリ側に次の準備が必要になります。
- debuggable=true状態でインストールする
- INTERNETのパーミッションを与える
その状態でPerfHUD ES付属の"enable_perfhud.sh"スクリプトをターミナルから実行すると、Nexus7側の設定がONになります。enable_perfhud.shは端末再起動ごとに無効化されますので、毎度実行する必要があります。
その状態でデバッグ対象のアプリを実行します。
以上の状態でPerfHUD ESを起動し、右下の"Not Connected"ボタンをクリックするとIPアドレスの入力画面になります。
端末のIPアドレスを入力し、Refreshボタンを押すとスキャンが始まりますのでしばらく待ちます。
該当のPIDが出現したら、選択してconnectします。
するとCPU負荷やGPU処理速度、フレームレート等が取得できるようになります。
PerformanceDashbord
デフォルトウィンドウであるPerformanceDashbordはリアルタイムの負荷を計測するのに役立ちます。
Tegra3はクアッドコアなのでCPU状態が4つ、GPU情報としてドライバの呼び出し時間や合計描画時間等、かなり有用な情報です。
フレームレートについてはeglSwapBuffer〜eglSwapBufferまでの時間を計測しているかと思います。
FrameDebugger
もう一つのウィンドウであるFrameDebuggerに切り替えると、フレームごとのレンダリング情報を見ることができます。
FrameDebugger起動中はレンダリングが停止するため、「現在の描画フレームの状態」を得るのに役立ちます。
Frame Overview
- 現在のフレーム各処理計測
Frame Scrubber
- 各描画命令ごとのバッファ内容の確認ができます。
- カラーバッファ、カラーバッファのα値、深度バッファ、ステンシルバッファそれぞれのプレビューも可能です。
- 巻き戻しや、描画命令毎にどのピクセルがレンダリングされたのかを知ることもできます
- Call Trace
- OpenGL ES命令の呼出履歴や戻り値の確認ができます
Geometry Viewer
- 実際にVBO/IBOの内容を読み取り、3D表示してくれます
- バッファの内容が実際にどうなっているのかを知ることができます
State Viewer
- 描画命令ごとにEGLContextの内容を知ることができます
- 想定と違うStateが設定されている等のチェックを行えます
Texture Viewer
- 読み込み済みのテクスチャ内容を表示してくれます
- BGRA表示には非対応で、BGRAテクスチャは強制的にRGBA表示されるようです
- mipmapを生成している場合、mipmapも表示します
- Shader Viewer
TextureViewでの問題点
TextureViewはAndroid 4.0から登場したハードウェアアクセラレーション対応のViewです。以前記事に書いたカメラの他、OpenGL ES等の処理が行えます。
もちろんこの状態でもPerfHUD ESは利用できますが、いくつかの問題点があるようです。
- TextureViewでPerfHUDを接続すると、レンダリングが画面に反映されなくなります
- プロファイリングは継続されますが、PerfHUD ES自体の動作も不安定になります
- レンダリング自体の速度が非常に遅くなります
まとめ
調べてみるとかなり便利なツールです。ある程度不安定な動作を差し置いても、開発ではとても役立つと思います。
個人的にはTextureViewでの動作をどうにかして欲しいので、USB接続に対応してくれると非常にありがたいのですが・・・。
- 作者: 山下武志
- 出版社/メーカー: オライリージャパン
- 発売日: 2011/07/21
- メディア: 大型本
- 購入: 3人 クリック: 71回
- この商品を含むブログ (9件) を見る