FPS(frame per second)を整える方法

導入

動画のなめらかさを表す指標。1秒間に何枚の画像を表示しているかを示す。



ゲームプログラミングにおいては、「1秒間に何回メインループを処理させるか」
という意味で使われることが多いようです。


FPSが制御されないと、コンピュータの性能差によって展開の速さ(弾幕など)に影響が出て
難易度が変わってしまうなどの現象が発生してしまう可能性があります。
そのためにも、ループごとに時間調整を行う必要性があります。




1秒間に60回のスピードで画面を切り替えることが多いようです。
→ 60 FPS


なので、ループ1回あたりの待ち時間は1/60秒…およそ16.666ミリ秒です。
(ここから秒=s、ミリ秒=msで書きます。)

処理方法
  1. 現在の時間を記録。(ms単位) → A
  2. メインループ
  3. 現在の時間を記録 → B
  4. AとBを比較して A + 16.666 > B であれば 3 に戻る。
  5. AとBとの時間差を記録

↓何度か試して時間差のリスト化する。

  1. 時間差の平均値を求める。
  2. 1秒当たりに換算する。(1000/時間差平均(ms)) → FPS
注意事項

描写処理を行うと多くの場合に16.666msを超えてしまい、FPSを保つことが出来なくなってしまいます。
この場合に有効なのがフレームスキップです。


処理方法のABを比較するときに、1回目で既に処理時間をオーバーしている場合には
フレームスキップのフラグを立てて、次のメインループの描写処理を一度飛ばします。
そうすることによっておおよその時間が保たれます。


ただし、コンピュータの処理能力が低すぎたり、要求するスペックが高すぎたりすると
描写処理がいつまで経っても始まらなくなってしまうことがあるので注意です。

サンプル
  1. Ruby/SDL
  2. C/C++