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

eaglesakuraの技術ブログ

twitterから派生した、技術的にちょっと込み入った話題とか。

Mac OSでPerfHUD ESを利用してNexus7のOpenGL ES負荷を測定する

OpenGL Android

Mac OSでPerfHUD ESを利用してNexus7のOpenGL ES負荷を測定する

いろいろあってヨドバシポイントを2万円分手に入れたので、検証機としてNexus7を購入しました。Nexus7はTegraを搭載していて、便利なツールがMacでも使えるので、そのメモです。

標準ツールでのOpenGL ESデバッグ

現在のAndroid SDKやADTはOpenGL ES用のトレーサーを提供しています。ですが、トレーサーにはいくつかの問題点があり、実際のアプリ開発では有効活用出来ない場合があります。

例えば、次のような問題点があります。

  1. 起動時にしか有効にできない
    • アプリデバッグ中にトレーサーを起動してデバッグを開始するという使い方ができません
    • そのため、アプリ開始時のロードや不要なシーンをスキップする等の作業が行いにくくなります
      • トレーサーをONにすると、OpenGL ES処理に数十倍の時間がかかってしまうためかなりメンドウです
  2. リアルタイムのトレースが出来ない
    • 基本的に呼出履歴の保存とフレームバッファの保存のみが行えるため、リアルタイム性が無い
    • 内容はトレース停止後でしか確認できない

PerfHUD ESとは

PerfHUD ESNVIDIA社が提供している、Tegra系列GPU専用のプロファイリングツールです。

端末のroot不要であり、adb経由でリアルタイムにCPU/GPUの処理内容をトレースすることができます。

また、アプリ起動中からのアタッチ・デタッチも自由に行えるため、標準ツール以上の自由度があります。

Nexus7はNVIDIA社のTegra3を搭載していますので、PerfHUD ESを利用することができます。(ちなみに、ESがつかないほうのPerfHUDはデスクトップ用GPU向けのようです)

ツール自体はNVIDIAのDeveloper登録が必要になりますが、無料で手に入れることができます。

接続方法

Windows版はUSBのWifi接続が可能ですが、Mac版はWifi接続のadb限定のようです。 また、アプリ側に次の準備が必要になります。

その状態でPerfHUD ES付属の"enable_perfhud.sh"スクリプトをターミナルから実行すると、Nexus7側の設定がONになります。enable_perfhud.shは端末再起動ごとに無効化されますので、毎度実行する必要があります。

その状態でデバッグ対象のアプリを実行します。

f:id:eaglesakura:20130511144149j:plain

以上の状態でPerfHUD ESを起動し、右下の"Not Connected"ボタンをクリックするとIPアドレスの入力画面になります。
端末のIPアドレスを入力し、Refreshボタンを押すとスキャンが始まりますのでしばらく待ちます。

f:id:eaglesakura:20130511144141j:plain

該当のPIDが出現したら、選択してconnectします。

するとCPU負荷やGPU処理速度、フレームレート等が取得できるようになります。

PerformanceDashbord

デフォルトウィンドウであるPerformanceDashbordはリアルタイムの負荷を計測するのに役立ちます。

Tegra3はクアッドコアなのでCPU状態が4つ、GPU情報としてドライバの呼び出し時間や合計描画時間等、かなり有用な情報です。

フレームレートについてはeglSwapBuffer〜eglSwapBufferまでの時間を計測しているかと思います。

f:id:eaglesakura:20130511144228j:plain

FrameDebugger

もう一つのウィンドウであるFrameDebuggerに切り替えると、フレームごとのレンダリング情報を見ることができます。

FrameDebugger起動中はレンダリングが停止するため、「現在の描画フレームの状態」を得るのに役立ちます。

  • Frame Overview

    • 現在のフレーム各処理計測
  • Frame Scrubber

    • 各描画命令ごとのバッファ内容の確認ができます。
    • カラーバッファ、カラーバッファのα値、深度バッファ、ステンシルバッファそれぞれのプレビューも可能です。
    • 巻き戻しや、描画命令毎にどのピクセルがレンダリングされたのかを知ることもできます

f:id:eaglesakura:20130511144509p:plain

  • Call Trace
    • OpenGL ES命令の呼出履歴や戻り値の確認ができます

f:id:eaglesakura:20130511144537p:plain

  • Geometry Viewer

    • 実際にVBO/IBOの内容を読み取り、3D表示してくれます
    • バッファの内容が実際にどうなっているのかを知ることができます
  • State Viewer

    • 描画命令ごとにEGLContextの内容を知ることができます
    • 想定と違うStateが設定されている等のチェックを行えます
  • Texture Viewer

    • 読み込み済みのテクスチャ内容を表示してくれます
    • BGRA表示には非対応で、BGRAテクスチャは強制的にRGBA表示されるようです
    • mipmapを生成している場合、mipmapも表示します

f:id:eaglesakura:20130511144606p:plain

  • Shader Viewer
    • コンパイルされたシェーダーのuniform/attribute内容を確認できます
    • シェーダーのソースコードも表示され、ソースコードの修正・コンパイルチェック・修正後のUniform内容チェック・ソースコード保存も行えます
      • ただし、現状だとコンパイルしたシェーダーを端末に書き戻すことは出来ないようです
        • 自力で読み直せってことですね
        • その辺はアプリ側の工夫次第でどうにか、というレベル
    • uniform textureはテクスチャのプレビューも行なってくれます

f:id:eaglesakura:20130511144618p:plain

TextureViewでの問題点

TextureViewはAndroid 4.0から登場したハードウェアアクセラレーション対応のViewです。以前記事に書いたカメラの他、OpenGL ES等の処理が行えます。

もちろんこの状態でもPerfHUD ESは利用できますが、いくつかの問題点があるようです。

  • TextureViewでPerfHUDを接続すると、レンダリングが画面に反映されなくなります
    • プロファイリングは継続されますが、PerfHUD ES自体の動作も不安定になります
  • レンダリング自体の速度が非常に遅くなります

まとめ

調べてみるとかなり便利なツールです。ある程度不安定な動作を差し置いても、開発ではとても役立つと思います。

個人的にはTextureViewでの動作をどうにかして欲しいので、USB接続に対応してくれると非常にありがたいのですが・・・。

初めてのOpenGL ES

初めてのOpenGL ES