コード探偵 ファイル01「パフォーマンス殺害事件」

PCやゲーム機の仕組みが非常に複雑になった現在、処理落ちしている状態、つまりパフォーマンス問題がある場合、その原因究明にはシャーロック・ホームズ(もしくは、コナン君、金田一君、夢羽など)と同じような探偵としてのスキルが求められます。 もちろん、ここでいうスキルというのは、殺人事件に出くわす確立が異常に高いというものではなく、事件を解決する能力です。

  • パフォーマンスは死んだ
  • 誰が殺したか?

この事件を解決するには、探偵と同じように仮定を立て、証拠を集め、推理力を働かせることで犯人(パフォーマンス低下の原因)を特定しないといけません。

幸い、小説やマンガの中の探偵のように生命の危機に立たされることはないし(っていうか、コナン君とか金田一君に出会うこと自体が死亡フラグだよね)、なにより時間を巻き戻して殺害現場(パフォーマンス問題がある場所)を何度も繰り返し再生することで、パフォーマンスを殺す凶器になりそうなものを断定することができます。

例えば、氷の塊(氷の剣のトリックのタネ)があったとしたら、この氷の塊に該当するコードを一時的に取り除いて、殺害シーンを再生。もし、パフォーマンスが死ななかったら、この氷の塊がパフォーマンスを殺した凶器と断定できます。氷の塊を取り除いてもパフォーマンスが死んだ場合、氷の塊は凶器ではないということなので、つぎに凶器となりそうなコードを見つける作業を続けます。

プロファイリングの準備

犯罪捜査では犯人を特定するのにプロファイリングと呼ばれるものがありますが、プログラムの世界でもパフォーマンスを殺した犯人を特定する方法を同じくプロファイリング(性能解析)と呼びます。

XNA Game Studioでプロファイリングをするには、以下の下準備をします。

  • プロファイル用のソリューション構成を設定する(省略可、でもあると便利)
  • Update設定をプロファイル用に設定する

プロファイル用のソリューション構成をするには以下のステップを踏みます。

1. ビルドメニューから、構成マネージャを選択 して、構成マネージャを表示する

profile001

2. 構成マネージャダイアログ内の、アクティブ ソリューション構成のコンボボックス内の「<新規作成...>」を選択して「新しいソリューション構成」を表示する。

profile002

3. 新しいソリューション構成ダイアログで、名前を「Profile」、設定のコピー元にReleaseを設定し、OKボタンを押して決定。

profile003

4. プロジェクト・プロパティ画面で構成にProfileを選択し、条件付コンパイル シンボルに「PROFILE」を追加する。

profile004

これで、プロファイル用の構成ができました。

次に、プロファイルをするのに必要なUpdate設定にします。これは、IsFixedTimeStepにfalseを指定して可変更新に設定し、SynchronizeWithVerticalRetraceにfalseを指定して垂直帰線期間同期(V-Sync)を待たない設定にします。

 #if PROFILE
    // プロファイル用コード
    // ここではV-Syncを解除し、可変更新モードに変更している
    graphics.SynchronizeWithVerticalRetrace = false;
    IsFixedTimeStep = false;
#endif

上のコードでは、プロファイル用構成を設定したときに作ったPROFILEシンボルを使って#if、#endifでコードを囲むことによって、このコードがプロファイル用構成にしたときにのみにコンパイルされるようにしています。

ここで気をつけないといけないのは、プロファイル時には可変更新にする必要があるので、ゲームが固定更新向けに作られている、つまりGameTimeの値を無視している場合にはゲームの実行速度が変わってしまうということです。処理落ちがない状態だと、ゲーム更新速度が速くなりすぎて、時にはゲームをプレイするのが不可能なくらい速くなってしまうことがあります。処理落ちしている場合は逆にゲームの実行速度が遅くなるので、スローモーションでプレイしているようになります。プロファイルが必要なのは処理落ちしている状態なので、ゲームが速すぎるという問題はないでしょう。

また、IsFixedTimeStepはゲーム実行中に変更することができるので、プロファイルしたい場面までは固定更新にして、必要になったら可変更新に切り替えるということもできます。

つづく…

元ネタ:

https://blogs.msdn.com/shawnhar/archive/2008/03/14/understanding-gpu-performance.aspx