MENU閉じる

HEXA BLOG

プログラム

HEXA BLOGプログラム2010.10.19

プロファイラ

こんにちは。平尾です晴れ
学生さんは来年の就職活動に向けて制作にとりかかり始める時期でしょうか。
PC上で動く作品だと機種によって大きく性能が変わってくるのであまり意識していないかもしれませんが、今回は処理時間測定プログラムについて説明したいと思いますモータースポーツ
処理時間測定プログラムは一般的にはプロファイラと呼ばれています。
プロファイラはゲームを作る上でとても重要な機能で、どんなゲームタイトルでも開発用機能として用意されていると思います。
ゲームの処理時間は1/60秒や 1/30秒といった感じで非常にシビアなため、高速化できるところはできるだけ行っていますパンチ
ところが、プログラムを組んでいて
「ここは時間がかかるだろうなぁ」
と思っていても、意外と処理時間が短かかったり、逆に
「ここは簡単な処理なので大丈夫だろう…」
と思っていても、呼び出し回数が膨大ですごく処理時間が長くなったりしますがく〜(落胆した顔)
実際にどれくらい時間がかかっているのかを知るためには、測定するプログラムを書けばいいわけです!ひらめき
プログラムのためのプログラム。
というわけで、非常に簡単なプロファイラの説明をします。
考え方は非常にシンプルです。
処理したい区間の前後で現在の時間を測定して、時間の差分を表示する、というものです時計

    int function(void)
{
// 開始時間(A)を取得
:
:
// 終了時間(B)を取得
// (B) - (A) で差分を求め、画面に表示する
}

PCでの時間測定には次の関数を使用します。
 QueryPerformanceFrequency : 高分解能パフォーマンスカウンタの更新頻度(1秒間の更新回数)
 QueryPerformanceCounter : 高分解能パフォーマンスカウンタの現在の値
時間測定には timeGetTime(), GetTickCount() などもありますが、上記関数がより細かい粒度で時間を取得できます。
計測開始と終了で QueryPerformanceCounter を呼び出し、カウンタを取得します。
カウンタの差分を QueryPerformanceFrequency で割れば、処理に何秒かかったか測定できます。
QueryPerformanceFrequencyをそのまま使うと結果には非常に小さい値しか出てこないので、1/1000, 1/1000000 などにして使うことで、ミリ秒やマイクロ秒といった単位で取得することが出来ます。
プロファイラの基本は上記の形です。
さらに使いやすく&分かりやすく変更するなら

・プロファイラに文字列を渡し、同じ名前の処理を後で集計、一覧表示するメモ
・グラフなど使用してグラフィカルに表示する
・使いやすくするため、クラスのコンストラクタとデストラクタを使って時間を測定

といったことが挙げられると思います。
この辺の詳細が気になる方は GameProgrammingGems (3巻1-17、2巻1-11、1巻1-14)を参考にすると良いと思います。位置情報
処理時間に余裕が出来れば、より多くのキャラクタを表示できたり、さらに追加でいろんな演出が出来たりします。プロファイラを使い、一番処理の重い箇所(ボトルネック)を見つけ、そこを高速化していきましょう!新幹線
あっと驚く作品が出来上がるのをお待ちしていますわーい(嬉しい顔)

RECRUIT

大阪・東京共にスタッフを募集しています。
特にキャリア採用のプログラマー・アーティストに興味がある方は下のボタンをクリックしてください

RECRUIT SITE