前回に「ゲームの状態変更の実装方法3」を書くような事を言いましたが、気が向かなかったので今回はFPSカウンターの作り方メモります。ちなみに、XNA前提で書かれています。
FPSとは大体の場合は1秒間に何フレーム(コマ)描画されたかをあらわす数字です。ゲームでは基本的に60、もしくは30を目標としている場合が多いです(細かいことを書くと違う気がしますが、今回は良いことにしときます)。
これを計算するには基本的に:
– 描画される毎に(Draw()メソッドが呼ばれるたび)フレーム数を上げる
– 1秒ごとにFPSを計算する(式はフレーム数 / 経過時間)
– フレーム数をリセットする
を繰り返すことです。
上記をXNAで実装するには、まず新しいクラスを作り、各変数を宣言します。
class FPSCounter { float m_fps; // 実際のFPS float m_interval; // FPSの更新速度(殆どの場合は1秒) float m_updateTimer; // 更新するまでを計るタイマー int m_frameCount; // 現在のフレーム数 public FPSCounter() { m_fps = 0.0f; m_interval = 1.0f; m_updateTimer = 0.0f; m_frameCount = 0; }
このクラスでのFPS計算はGame1内のDraw()メソッドで処理します。なので、FPSカウンター内では計算と描画(FPSを画面に表示)を同じメソッドで行います。行う処理は、上で説明したのと同じで、最後に描画処理を足しただけです。
// Game1内のDraw()メソッドで呼んでください public void Draw(SpriteBatch sp, SpriteFont font, float delta) { // フレーム数を増やす(目標は1秒に60回) m_frameCount++; // タイマーに前のフレームから過ぎた時間を加算する m_updateTimer += delta; // タイマーが1秒を超えたら if (m_updateTimer > m_interval) { // FPSを計算する, 速度が下がっていた場合はここで差を計算する m_fps = m_frameCount / m_updateTimer; // タイマーとカウンターをリセットする m_frameCount = 0; m_updateTimer -= m_interval; } // FPSの数値を描画する sp.DrawString(font, "FPS: " + m_fps, new Vector2(0, 0), Color.White); }
後は、Game1クラス内で、FPSカウンターを作り、Draw()メソッドを呼ぶだけです。
// 前のフレームから経過した時間を獲得する(秒で) float delta = (float)gameTime.ElapsedGameTime.TotalSeconds; spriteBatch.Begin(); fps.Draw(spriteBatch, font, delta); spriteBatch.End();
これで、画面の左上にFPSが表示されます。描画をする前に、SpriteFontを作製し、読み込むのを忘れないようにしてください。
ちなみに、実際に起動してみるとFPSはかなり高い可能性で59.9999…のような長い数字になります。これをもっと見やすくするには、FPSの描画を以下に変更してみてください。
sp.DrawString(font, string.Format("FPS: {0:F2}", m_fps), new Vector2(0, 0), Color.White);
これにより、FPSの小数点は以下は2つまでしか描画されなくなります(string.Format()については、MSDNをご参照ください)。
実装後はこんな感じになります(左上にFPSが出ています)。
以上です。ちなみに、上の動画では見やすくするためにFPSの描画を違う色で二回しています。
前にも書きましたが、最近ネタが思いつかないのでリクエストがあったらコメントか、メールをお送りください m_ _m
その他にも、質問や間違い、ツッコミどころがあればコメントをください。
[…] 今回は前に作ったFPSカウンターのクラスで実装例を書きます。まず、FPSカウンターのクラスで、DrawableGameComponentクラスを継承し、コンストラクタも書きます。 […]