はかせのラボ

私の頭の中を書いていく雑記ブログです

DirectX リフレッシュレートとFPS ~理屈偏~

あいさつ

どうも、はかせです。
今回はリフレッシュレートとFPSについてです。

リフレッシュレート

1秒間に何回画面が切り替わるかの値です。
60Hzなら60回、120Hzなら120回切り替わります。
多分PCでシューティングみたいなリアルタイム性の強いゲームを
やる方であれば気にする値だと思います。

FPS

1秒間に何回フレームを切り替えるかの値です。
60FPSなら60回、120FPSなら120回フレームが更新されています。
こっちはゲーム開発とかやる方が気にする値だと思います。

違いは?

なんか似た様なものですよね。説明も似せました。
この2つの違いは切り替えるのが
「画面」なのか「フレーム」なのかです。

画面

言葉のまんまです。
今見ている画面そのものです。
コンピューターはどこまで行っても静止画しか出せません。
「動いているもの」は表示できないのです。
「動いているもの」というのは何も動画とかだけの話ではありません。
物を移動させるのも文字を入力するのも、
画面に変化があればそれは「動いているもの」です。

ではどうやって「動いているもの」を表示しているか。
原理はパラパラ漫画、セルアニメと同じです。
細かい差分を用意して人間が認識できないほど早く切り替えているだけです。

フレーム

これは画面に表示するものです。
画面で話した静止画や「動いているもの」の実体です。

なのでフレームの更新が遅れると画面に出せないのでカクツキが起こるわけですね。

なんでこんな話を?

グラフィックスプログラミングにはVsyncというものがあります。
和訳すると垂直同期です。
これは画面の更新と処理の更新を同期させる手法です。
つまりVsyncを使うとリフレッシュレート=FPSの形になるわけですね。

もちろん処理負荷等の外部要因でこうならないことも多々あります。

一般的にリフレッシュレートとFPSが同期しているのは
理想的だとされています。
ですが多くのゲームではFPSが60FPSに固定されています。なぜか?

例えば1秒で1m進むプログラムを作ったとしましょう。
基本的にゲーム内での1秒は60FPSです。
つまり上のプログラムは
60FPSで1m進むプログラムであると言えます。

では、FPSが120になったらどうなるでしょうか。
答えは1秒で2m進む、です。

プログラムは一切変更していないのに処理結果が変わってしまいました。
これがFPSを固定する理由です。
環境等の理由でプログラムの動作が変わるのを防ぐためです。

あとがき

今回は一般的とされる60FPSで話をしましたが
VRやなんかでは90FPS無いと酔いにつながると言われます。

要は60FPSに固定するのが大事なのではなく
プログラムを組んだ時想定していたFPSに固定することが大事なのです。

今回は理屈偏ということでコードは1文字も出していません。
コードについては次回出そうと思います。
(訳まだできてませんw)

それでは今回はこの辺でノシ