PerfHUD ESを使ったTegra搭載機でのOpenGL ESデバッグ

NVIDIAのPerfHUD ESを使い、Tegra3を搭載したAndroidタブレット(Google Nexus 7)でOpenGL ES 2.0のデバッグを試しました。

PerfHUDはNVIDIAが無償提供する3Dアプリケーションのパフォーマンスアナライザです。PerfHUD ESはそのAndroid版で、OpenGL ES 2.0に対応しています(OpenGL 1.xは非対応)。現在のバージョンは1.96で(公式サイトでは1.98と書かれていますが、なぜか1.96しかありませんでした)、Tegra2からTegra4までをサポートします。

ここでは、ホスト側PCがWindowsであることを想定して説明します。

■必須環境

Tegra2以降を搭載し、GPUデバッグが可能なAndroidスマートフォン・タブレット(Android 4.0以降ならほぼ対応)※root権限は不要
USB接続で通信できる(=Android SDKのadbがAndroidを認識できる)Windows/Mac OSX/Linux PC
OpenGL 1.5以降に対応したGPU(Windows Vista以降のPCならほぼ対応)

【注意】GeForce 6以降のNVIDIA製GPUが推奨だそうです(筆者環境はオンボロなIntel GM45)。

■ダウンロード

PerfHUD ESのサイトの”WHERE CAN I FIND IT?”内にリンクがありますが、実はTegra Registered Developer Programの参加登録をしなければForbiddenになりダウンロードできません。

Tegra Registered Developer Programに登録するには、NVIDIA Developer Zoneのアカウントを作成し、アカウントページのRegistered Developer ProgramsのTegra Registered Developer Programの右側にあるApplyを押し、必要な情報を入力します。その後審査(?)があり、許可が下りるとダウンロードできるようになります。このとき使用用途を英語で書く必要がありますが、筆者の場合30字くらいのありがちな(しかも英語として正しいのかどうかも怪しい)内容でも通りました。許可が下りるまで15分程度でしたが、人によっては半日かかることもあるようです。

許可が下りてログイン状態でリンクをクリックすると、Tegra Android Developer Pack(以下TADPと略す)がダウンロードされます。これはAndroid開発で使うツールを一式まとめたもので(Java SDKからOpenCVまで入っている)、この中にPerfHUD ESが入っています。ちなみに、筆者の場合、Cygwinにチェックが入っている状態でインストールするとエラーになりました(日本語環境では駄目なようです)。

■デバッグ開始までの手順

Adreno Profilerを使ったことのある人にとっては分かりやすいかもしれませんが、お世辞にも簡単とは言えません。

まず、Android端末のPerfHUD ESデバッグを有効化します。”C:\NVPACK\perfhud_switch\enable_perfhud.bat”を実行します。中身は、ただadb shellコマンドを実行しているだけです。デバッグが有効になるのはAndroid端末を再起動した後で、しかもまた再起動するとデバッグが無効になります。

次に、Android端末とPCの接続設定をします。まず、コマンド”adb forward tcp:7876 tcp:7876″を実行し、ポートフォアワーディングができるようにします。7876は、PerfHUD ESがデフォルトで使用するポート番号です。また、ファイアウォールのTCPポート7876番を例外設定します。Windowsファイアウォールの場合、詳細設定を開いて「送信の規則」と「受信の規則」の両方で「新しい規則」を作成し、TCPポート7876番を「許可」します。筆者環境では試していませんが、もしTADPに同梱されているADBのインストール時にアプリケーション単位で接続ブロックする設定にしてしまった場合、それも解除する必要があるはずです。ここまでの操作は、1度行えば接続解除後も引き継がれます。

そして、PerfHUD ESを実行します。デフォルトでは”C:\NVPACK\perfhud_es\PerfHUDES.exe”にあります。画面右下のアイコン(AndroidデバイスがPCに接続されていれば”Not connected.”と表示される)をクリックします。この操作を行うと、もし既にAndroid端末との接続状態であれば直ちに切断されます。Android端末でOpenGL ESアプリケーションが動作していれば、プロファイル可能なアプリが表示され、すぐにプロファイリングを始めることができます。そうでない場合、”ADB Launcher”にチェックを入れるとアプリが列挙され、デバッグしたいアプリを選択してダブルクリックする(あるいは”Connect”を押す)とプロファイリングが始まります。

【注意】デバッグするアプリケーションはINTERNETパーミッションを許可していなければならないようです。そうでない場合、”ADB Scan…”から進みません。ドキュメントのどこにも書かれていないような…

【注意】一部のOpenGL Extension APIを使用していると、プロファフィル開始直後にPerfHUD ESが無言で終了します。筆者環境では、GL_EXT_occlusion_query_boolean拡張のglBeginQueryEXT()を使っていると終了しました。

■PerfHUD ESでできること

PerfHUD ESには”Performance Dashboard”と”Frame Debugger”の2画面があります。

Performance Dashboardでは、リアルタイムにCPU使用率やフレームレート、API種別ごとの使用時間などが表示されます。テクスチャの解像度を強制的に2×2にしたり、フラグメントシェーダを無効にしたりすることで、ボトルネックがどこにあるのかを探すことができます。

perfhudes_pd

Frame Debuggerでは、APIの呼び出し回数、レンダーターゲット・深度バッファの可視化、APIトレース、ジオメトリビューア、状態ビューア、テクスチャビューア、シェーダビューア(リアルタイム編集も可能)ができます。画面下部にシークバーがあり、途中のDraw Callの結果も見ることができます。ただし、API呼び出しの回数が多いほど解析の時間も長くなります。

perfhudes_fd

【注意】Geometry Viewerは、モデルがインテックス付き(つまりglDrawElements()による描画)でなければ表示されないようです。Vertex Buffer ObjectとElement Array BufferとglBindAttribLocation()を組み合わせた状態では表示されましたが、Element Array BufferなしでトライアングルリストをglDrawArrays()した場合はエラーが表示されました。これもドキュメントのどこにも書かれていないような…(一応、別のドキュメントで「パフォーマンス向上のため、Tegra3は必ずインデックスバッファを使うことを推奨する」とは書かれてはいます)

【注意2】編集したシェーダを適用すると、glGetError()が1度だけエラーを返します。Snapdragon + Adreno Profilerでも同じことが起きるので、回避できないと思われます。プログラムがエラーチェックを行って強制終了するような仕組みがある場合、一旦無効にしなければなりません。

■終了

それなりの確率でPerfHUD ESがクラッシュするので、切断した後に終了することをお勧めします。尤も、実害はないのですが。

■使った感想

動作がやや重く、たまに不安定になるものの、必要な機能は一通り揃っており、GPUメーカーらしい作り込みを感じます。TegraでOpenGL ES開発をする人にはお勧めです。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中