デバッグサンプル
2010/09/17 追記: XNA Game Studio 4.0用のサンプルをhttp://higeneko.net/hinikeni/sample/xna40/DebugSample.zipにアップしました。詳細は「サンプルコードをXNA 4.0向けに更新」を見てください。
2009/06/25 追記: XNA GS 3.1用のサンプルを http://higeneko.net/hinikeni/sample/xna31/DebugSample.zipにアップしました
2009年1月24日追記: サンプルプログラムのキーボード処理部分でテンキーの0を押すと1が入力されるバグを修正、アップデートしました。バグがあった場所はGameDebug/KeyboardUtils.csファイル内のInitializeKeyMapメソッド内の初期化コード部分です。AddKeyMap( Keys.NumPad0, "10" )となっているのをAddKeyMap( Keys.NumPad0, "0" )にする事で修正できます。連絡してくださったDERNAさんに感謝します。
デバッグ3種の神器
ゲーム開発現場で最も使われているゲーム内で動作するデバッグ用の機能といえば以下の3つがあります。
- FPSカウンター
- リアルタイムプロファイラー
- デバッグコマンド
市販されているPCゲームの中にはオプション画面でFPSカウンターを表示できるようになっているものもあるので、パフォーマンスの指標として有名です。後のふたつについては一般にはあまり知られていませんが、ゲーム開発現場、特に北米のゲーム開発現では良く目にする機能です。
前回紹介したGamefest Japan 2008のデモでも、これらの機能を使っています。そこで、今回は前回のデモからデバッグ機能だけを抜き取ったサンプルを作りました。
http://higeneko.net/hinikeni/sample/DebugSample.zip
前回と同じく、フォントはConsolasを使用しています。Consolasフォントが無い場合はビルドエラーになるので、以下のURLからConsolasフォントをダウンロードするか、フォント名を変更するようにしてください。
使い方
サンプルを起動すると、画面右上に使い方が表示されます。
- FPSカウンターの表示
- Aボタン、またはAキー
- TimeRulerの表示
- Bボタン、またはBキー
- TimeRulerログ表示
- Xボタン、またはXキー
- デバッグコマンドUIの表示
- Tabキー
- サンプルプログラムの終了
- Backボタン、またはEscapeキー
デバッグコマンドUIはキーボード入力からデバッグ用コマンドを実行します。Xbox 360でもUSBキーボードを本体に繋げることで使うことができます。デバッグコマンドUIには元々使えるコマンドとして画面をクリアするclsコマンド、登録されているコマンドを表示するhelpコマンドがあります。基本的にWindowsにあるコマンドシェルと使い方は一緒で、上下キーで最近使ったコマンドのヒストリを表示する機能もあります。
このデモでは、DebugSampleGame.cs内には独自のデバッグコマンドを追加するサンプルコードが含まれていて、ここではposコマンドを追加して、画面上に表示される「+」マークの位置を表示したり、変更できるようになっています。下の動画では見づらいですが、最初は左上にあった白い点がposコマンドによって画面下中央に移動しているのが判ると思います。
サンプルに含まれるファイル
このサンプルに含まれるファイルには、デバッグ機能の使い方のサンプルコードが入ったDebugSampleGame.csファイルの他に、デバッグ機能を提供する以下の8つのファイルがあります。
DebugSample/GameDebug/DebugCommandUI.cs | デバッグコマンドUIクラス |
DebugSample/GameDebug/DebugManager.cs | デバッグ用のコンテントを格納する為のゲームコンポーネント |
DebugSample/GameDebug/FpsCounter.cs | FPSカウンター |
DebugSample/GameDebug/IDebugCommandHost.cs | デバッグコマンド用のインターフェース |
DebugSample/GameDebug/KeyboardUtils.cs | キーボード入力用ユーティリティクラス |
DebugSample/GameDebug/TimeRuler.cs | タイムルーラー |
DebugSample/Utils/Layout.cs | 画面レイアウト用構造体 |
DebugSample/Utils/StringBuilderExtensions.cs | StringBuilder用拡張メソッド宣言クラス |
自分のゲームにデバッグ機能を追加するには、上記の8つのファイルをプロジェクトに追加し、DebugManager、FpsCounter、TimeRuler、そしてDebugCommandUIコンポーネントをゲームのInitializeメソッド内で以下の様に追加する事で使用することができます。
// デバッグマネージャーの初期化と追加
debugManager = new DebugManager( this );
Components.Add( debugManager );
// デバッグマコマンドUIの初期化と追加
debugCommandUI = new DebugCommandUI( this );
// デバッグコマンドUIを最上面に表示させる為にDrawOrderを変更する
debugCommandUI.DrawOrder = 100;
Components.Add( debugCommandUI );
// FPSカウンターの初期化と追加
fpsCounter = new FpsCounter( this );
Components.Add( fpsCounter );
// タイムルーラーの初期化と追加
timerRuler = new TimeRuler( this );
Components.Add( timerRuler );
DebugManagerとDebugCommandUIは自分自身をサービスとして登録するので、この二つは他のデバッグ用コンポーネントの前に追加する必要があります。
次回から、それぞれのデバッグコンポーネントの使い方に付いて説明していきます。
Comments
Anonymous
December 27, 2008
PingBack from http://www.codedstyle.com/%e3%83%87%e3%83%90%e3%83%83%e3%82%b0%e3%82%b5%e3%83%b3%e3%83%97%e3%83%ab/Anonymous
December 27, 2008
注:今回紹介するコンポーネントは デバッグサンプル に入っています。 正確な測定には注意が必要 FPSカウンターは、一定時間内に(数秒程度)何フレーム更新できたかを計測した結果から、1秒間のフレーム数、FPS(FrameAnonymous
December 29, 2008
注:今回紹介するコンポーネントは デバッグサンプル に入っています。 時を測る 前回紹介したFPSカウンターではゲーム全体のパフォーマンスを測定するには使えますが、どの処理がどれだけ時間が掛かっているかを判定するには不向きです。Anonymous
January 07, 2009
これは大変便利なデバッグUIのベースですね。 ゲーム用のデバッグ機能を追加するのも簡単そうな仕組みですし、大変参考になります。 一点ダウンロードファイルの状態だと、テンキー処理の AddKeyMap( Keys.NumPad0, "10" ); が10になっていて入力文字が1になっておりました。Anonymous
January 22, 2009
注:今回紹介するコンポーネントは デバッグサンプル に入っています。 開発中にいろんなものを実行したい ゲーム開発中には様々な情報が欲しくなる場面が沢山あります。シンプルな情報であればブレークポイントを設定して変数を調べたりすることができますが、3Dゲームで画面に表示されている数十体もある敵のうちからひとつの敵の情報をデバッガを使って得るのは大変です。また、スタンドアローン実行している状態、例えばVisualAnonymous
February 23, 2010
初めまして。こんにちは。ウィルフレムといいます。 一つお聞きしたいことがあるのですが DebugCommand, TimeRular等のコンポーネントのソースコードのライセンスについて聞きたいのですが。 どこまで利用は可能なのでしょうか? (改変しての再配布は可能なのかどうか)Anonymous
May 15, 2010
返事が遅れて申し訳ありませんでした。 ライセンスについてですが、改変や商用も含む再配布も自由です。