パフォーマンスの計測

今回は以前アップしたソースにパフォーマンス計測の機能を追加しました。

具体的には、CPUの占有率と、高分解能パフォーマンスカウンタを使った処理負荷の計測です。
exeファイルを実行すると、右下にバーが表示されます。
下の黄色い線がCPUの占有率、
上の線の赤い部分がCAppクラスのUpdate関数呼び出しにかかった時間、
緑の部分が描画にかかった時間、
中央あたりに表示されている縦線が1フレームで処理できる最大値になります。
バーが短いほど処理負荷は軽いということになります。
ちなみにテストのためにUpdate関数を1000回呼び出しています。

CPUの占有率はパフォーマンス データ ヘルパ (PDH)を使用して計測しています。
スレッドを使用して、1秒ごとに更新されるようになっています。
詳細はperformance/processor_time_counter.cpp をご覧ください。

処理負荷の計測に関しては QueryPerformanceCounter を使用しています。
この関数はQueryPerformanceFrequency とセットで使います。
QueryPerformanceFrequency は1秒間をどれだけ細かく分割出来るかの数値を取得できます。
このサンプルでは、メインループの先頭で一旦 QueryPerformanceCounter を呼び出し、
その数値との差分がどれだけかでカウントを取っています。
このサンプルは1秒間に60フレームで動くことを想定しているので、
( カウントの差分 * 60 ) / QueryPerformanceFrequency で取ってきた数値
で1フレームにどれだけ処理出来るかが計算できます。
ちなみに ( カウントの差分 * 60 ) > QueryPerformanceFrequency で取ってきた数値
になった場合は処理落ちする事になります。
詳細はperformance/performance_counter.cpp をご覧ください。

最後に、描画負荷に関してですが、
DirectXを使用して描画する場合、正確に計測することは難しいらしいです。
詳しくはDirectXのマニュアルの”Direct3D API 呼び出しの正確なプロファイル”あたりを読んでみてください。
IDirect3DQuery9を使ってコマンドバッファをフラッシュすることでそれなりに正確な数値を取れるはずです。
一応このサンプルでもやってますので、ご興味がおありでしたら、
app.cpp の CApp::MainLoop メソッドを解析してみてください。

なんだか読みづらい記事になってしまい申しわけありませんが、
とりあえずサンプルコードを見ればわかっていただけるかと思います。
コード中のコメント少ないですが…
これからまたコメントも含めてソースを整理していきたいと思います。

コメントする

post date*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トラックバックする

トラックバック用URL:

アニメーションが親切に解説されております

レンダリング、ライティングの基本が分かります

図版が見やすい美術解剖書です