引き続きフレームレートの向上を目指す

 Dragoon(仮)は、これまでフレームレート関係の状態は、自作のもので見てきました。しかし、処理の遅い部分を特定するために、複数の箇所の負荷を視覚化してみたかったので、今回は、ひにけにXNAデバッグサンプル(2009/06/25版DebugSample)を利用してみることにしました。TimeRulerインスタンスのBeginMarkメソッドとEndMarkメソッドの呼び出しを仕込むわけです。

 ところで、Game派生クラスのDrawメソッドは原則として、目標のFPSより遅いときにはFPS維持のために、呼び出しがスキップされます。
 ここでDebugSampleの用法上の問題があり、描画スキップが起きると、描画関連の計測のためにDrawメソッド内に仕込んでおいたBeginMarkメソッドとEndMarkメソッドが呼ばれないことになります。その結果、描画に関する情報がないログが記録され、次の描画時に表示される仕組みになっているようです。そのため、フレームレートの具合によって、TimeRulerが表示する描画に関するバーがちらついてしまいます。

 そこで、少し使い方を変えて、Drawメソッドをフレームの始まりとして評価してみることにしました。
(※この他の選択肢として「Game.IsFixedTimeStep = false」を設定するデバッグ方法があります。この方法は、Dragoon(仮)では、ゲームの進行速度に影響します。)

 現状の主要な負荷はグラフィック関連にあります。CPUの時間をみているので、GPUを間接的に評価している点が難しいところですが、負荷の傾向はつかむことができました。

 そのひとつとして、「ダメージ効果や煙などが表示されているときに負荷が増加する」と確認できました。これらはバッファを動的に書き換える方法を使っています。検討事項だったダブルバッファ化を行うことで、CPUとGPUの並行動作を阻害しないように調整しました。