今回エンジニアブログを担当する小瀬です。
3D開発などを行っていると、GPU側の挙動が見えずデバッグに苦労する事があるかと思います。
XCodeにはGPUプロファイラが付いている事をご存知の方も多いかと思いますが、NVIDIA製のTegra2以降のGPU限定でAndroid上でもGPUプロファイリングができるPerfHUD ESをご紹介したいと思います。
■導入方法
□ アカウント登録
まずツールキットをダウンロードするためには、NVIDIAの開発者サイトへ登録する必要があります。
以下のデベロッパーサイトの右上にある「Login」から「Create User Account」でアカウントを作成します。
https://developer.nvidia.com/
□ デベロッパープログラムへの登録
その後、アカウント画面から各種デベロッパープログラムに登録する事ができるようになります。PerfHUD ESのダウンロードに必要なプログラムは以下のとおりですので、各プログラムの「Apply」を選択し、必要項目を記入します。登録後、一定時間後に認証が降り「Approved」となるようです。
・Basic Registered Developer Profile
・Graphics/Game Development Registered Developer Program
・Tegra Registered Developer Program
□ ダウンロード
各プログラムへの登録が完了すると、以下のダウンロードページにアクセスできるようになります。
https://developer.nvidia.com/tegra-resources
PerfHUD ES単体や、開発キットなどありますが、それぞれの環境に合わせて選択すると良いでしょう。
■PerfHUD ES を起動する
PerfHUD ES を起動する前に、いくつか設定が必要になります。
□ AndroidManifest.xmlに android.permission.INTERNET を加える
PerfHUD ES はデバイスとTCP/IPによる通信を行うため、パーミッションを設定しておく必要があります。
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
□ デバイスにデバッグプロパティを設定する
使用するデバイスを接続し、以下のコマンドで PerfHUD ES のプロパティを有効にする必要があります。(このコマンドは永続的なものではないため、デバイスを起動する度に再設定する必要が有るようです。)adb shell setprop debug.perfhudes 1
□ 起動
上記の設定が完了したら、PerfHUD ES を起動します。Android端末が接続されており、OpenGL ES を使用したアプリケーションが起動していると、そのままプロファイリングが開始されます。
※ ADBへのパスが上手く通っていないと、デバイスとの接続が失敗するようです。環境変数を変更するか、下記のようにコマンドで/android-sdks/platform-toolsなどへ移動し、PerfHUDを起動するとうまく行くようです。
cd {SDK_PATH}/android-sdks/platform-tools open -a {INSTALL_PATH}/NVPACK/perfhudes.app
■各種プロファイリング
PerfHUD ES では、1フレームでのGPUの処理時間をリアルタイムに計測する「Performance Dashboard」と、1フレーム内のコマンドバッファを取得し詳細に調査できる「Frame Debugger」があります。
□ Performance Dashboard
上記の通り、Performance Dashboard 上には、毎フレームのGPU処理時間をグラフとして表示してくれます。デバッグ機能として「2x2 Textures」「Ignore Draw Calls」「Null Fragment Shader」など、各GPU処理を切る(または非常に負荷の小さいものに切り替える)ことで、どこにボトルネックが有るかを調査することができます。
□ Frame Debugger
Frame Debuggerは、起動時に1フレーム内に発行されたGPUコマンドを全てフェッチするため多少の時間がかかりますが、Render/DepthBufferやRenderState、シェーダなどといった様々な情報を確認することのできる非常に強力なプロファイラです。
DrawCall単位で描画を停止させ、そのタイミングでのバッファの状態や実際に描画されているジオメトリが確認できるため、「描画されない」などといったバグを検出する際に役立ちます。(個人的には「ShaderViewer」からリアルタイムにシェーダを書き換えその場で反映させされる機能が面白いなと思いました)
Tegraを搭載したデバイスのみといった限定的な使用しかできませんが、ブラックボックスのように感じてしまうGPUを詳細に調査できる非常に有益なツールかと思います。モバイルでの3D開発はこれからどんどん加速していくと思いますので、効率的な開発の役に立てれば幸いです。