デバッグサンプル

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種の神器

ScreenShot

ゲーム開発現場で最も使われているゲーム内で動作するデバッグ用の機能といえば以下の3つがあります。

  • FPSカウンター
  • リアルタイムプロファイラー
  • デバッグコマンド

市販されているPCゲームの中にはオプション画面でFPSカウンターを表示できるようになっているものもあるので、パフォーマンスの指標として有名です。後のふたつについては一般にはあまり知られていませんが、ゲーム開発現場、特に北米のゲーム開発現では良く目にする機能です。

前回紹介したGamefest Japan 2008のデモでも、これらの機能を使っています。そこで、今回は前回のデモからデバッグ機能だけを抜き取ったサンプルを作りました。

 http://higeneko.net/hinikeni/sample/DebugSample.zip

前回と同じく、フォントはConsolasを使用しています。Consolasフォントが無い場合はビルドエラーになるので、以下のURLからConsolasフォントをダウンロードするか、フォント名を変更するようにしてください。

https://www.microsoft.com/downloads/details.aspx?familyid=22e69ae4-7e40-4807-8a86-b3d36fab68d3&displaylang=en

使い方

サンプルを起動すると、画面右上に使い方が表示されます。

  • 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は自分自身をサービスとして登録するので、この二つは他のデバッグ用コンポーネントの前に追加する必要があります。

次回から、それぞれのデバッグコンポーネントの使い方に付いて説明していきます。