ホーム < ゲームつくろー! < DirectX技術編

その62 NVIDIAのPerfHUDでパフォーマンスチェック


 DirectXでプログラムを組んでいると時に「?」という良く分からない描画結果になったりすることがあります。例えば半透明のモデルを描画した時に何故か背後のオブジェクトがバキッと切れてしまった、板ポリゴンを描画しているはずなのに画面にでない、など。また、どういうわけだかあるシーンだけが異常に重いという事もあります。そういう時に役立つのが「パフォーマンスチェック」です。

 ただ、DirectXの場合は多くの部分が隠蔽されてしまっているため、何が原因であるかを特定しにくかったりします。NVIDIAが提供しているPerfHUDはそんな悩みを解決してくれる一つの強力なツールです。YouTubeでのチュートリアルはこちら:
http://www.youtube.com/watch?v=UdDfvq0cL04

 PerfHUDを使うと、なんとDirectXのDraw系メソッド(IDirect3DDevice9::DrawPrimitiveなど)の単位で描画ステップを再現してくれます。さらにその描画にかかった時間、使用したテクスチャなども詳細に見ることができます。またシェーダを使った場合はシェーダコード(アセンブリ)までも見ることができます。

 このように機能盛りだくさんのPerfHUDですが、これを使用するにはプログラムを少しだけ追加する必要があります。この章ではその追加部分に焦点を当てます。なぜって、そこがPerfHUDの一番の手間だからです(^-^;



@ PerfHUDの導入

 PerfHUDはNVIDIAのホームページからダウンロードできます(こちら)。サイト内の「Download PerfKit 6.62(2010.4現在)」からお使いの開発機に該当するPerfHUDを選択します。ついでにその下にある「PerfHUD 6 Quick Tutorial」などのドキュメントもダウンロードした方が良いかと思います。

 ダウンロードしたファイルを実行してインストールをします。インストール作業までは指示に従えば良いので割愛致します。再起動を促されると思いますので気を付けて下さい。インストールが終了したらデスクトップにPerhHUDのアイコンが出来上がったと思います。これでPerfHUDを使える環境が整いました。



A PerfHUDの仕組み

 一般に、パフォーマンスチェックを行うためにはプログラムのあちこちにチェックするためのコードを埋め込む必要があります。FPSを計測するのもそうですよね。PerfHUDも内部ではそういうコードの埋め込みを行っていると思われます。ただし、それは私たちからは見えない描画デバイスの内部です。

 普段私たちはIDirect3DDevice9(描画デバイス)を作成して描画を行います。このインターフェイスはドライバとプログラムとの媒介になってくれています。NVIDIAのPerhHUDはこの描画デバイスを独自のパフォーマンスチェックが行えるデバイスに置き換えます。つまり、描画デバイスを作成する所の書き換えが必要なんです。



B PerfHUD用描画デバイスの作成コード

 以下はPerfHUDのドキュメントに掲載されている描画デバイス作成コードを一部改変したものです:

// Direct3Dの初期化
LPDIRECT3D9 g_pD3D;
LPDIRECT3DDEVICE9 g_pD3DDev;
if( !(g_pD3D = Direct3DCreate9( D3D_SDK_VERSION )) ) return 0;

// アダプタとデバイスタイプ
UINT adapterToUse = D3DADAPTER_DEFAULT;
D3DDEVTYPE deviceType = D3DDEVTYPE_HAL;

#if _DEBUG
// 'NVIDIA PerfHUD'アダプタを探してあればアダプタをそれに置き換え
for (UINT adapter = 0; adapter < g_pD3D->GetAdapterCount(); adapter++) {
    D3DADAPTER_IDENTIFIER9 identifier;
    HRESULT res = g_pD3D->GetAdapterIdentifier( adapter, 0, &identifier);
    if (strstr(identifier.Description, "PerfHUD") != 0) {
        adapterToUse = adapter;
        deviceType = D3DDEVTYPE_REF;
        break;
    }
}
#endif

D3DPRESENT_PARAMETERS d3dpp = {0,0,D3DFMT_UNKNOWN,0,D3DMULTISAMPLE_NONE,0, D3DSWAPEFFECT_DISCARD,NULL,TRUE,0,D3DFMT_UNKNOWN,0,0};

if (FAILED(g_pD3D->CreateDevice( adapterToUse, deviceType, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &g_pD3DDev) ) ) {
    g_pD3D->Release();
    return -1; // 描画デバイス作成失敗
}

IDirect3D9インターフェイスを作成した後に、PerhHUD用のアダプタ(仮想グラボのようなものだと思って頂ければ良いです)を探しています。見つかったらadapterToUseにそのアダプタ番号、そしてdeviceTypeにリファレンスモードフラグを格納しています。そう、PerfHUDはソフトウェアエミュレーションで動くんです。

 後はそのアダプタ番号とデバイスタイプをいつものIDirect3D9::CreateDevcieメソッドに渡してあげるだけです。このコードを皆さんお使いのエンジンに組み込む必要があります。



C PerhHUD起動

 このソースを入れて「じゃぁ実行」とやっても、じつはPerfHUDは起動しません。PerfHUDは「実行ファイルをデスクトップ上のアイコンに投げる」事で初めて起動するんです。

 VisualStudioで作成した実行ファイル(.exe)をデスクトップのPerfHUDアイコンにドラッグしてみて下さい。それで色々なグラフが流れる画面が出たら成功です!

 デフォルトでPerfHUDはOffになっています。これをONにするには「Ctrl + Z」を押します。すると下にバーが出ます。後はこのバーをクリックすると各種パフォーマンスチェックが行えます。

 最初はまってドキッとするのがPerhHUDの終了です。PerfHUDがOnになっている状態では右上の終了ボタンなど各種終了が行えません。PerfHUDを終了するには一番左側の「PerformanceDashborad」をクリックしてから「Ctrl+Z」でPerfHUDをOffにします。



 この章を設けた裏の理由は「PerfHUDの挿入コードってどうだっけ?」という私の備忘録の為…というのが本音です(^-^;。毎回このコードをPDFで見てそれを書き換えて挿入するのがとかく面倒でして。こうしてサイトに残しておけば楽々です。PerfHUDは知りたい所に手が届いているツールです。皆さんも積極的に使ってみて下さい。