FPSとリフレッシュレートについて

FPSとリフレッシュレートについて調べる機会があったので書いておきます。

FPSとリフレッシュレート

FPSはCPUやGPUにより1秒間に何フレーム処理が行われているかを指します。
こちらはゲームを作っていると自然と意識する概念だと思います。

これに対してリフレッシュレートはディスプレイが1秒間で画面を更新できる回数のことです。
これはハードウェア(ディスプレイ)の性能に依存します。
単位はHzで、例えば60Hzであれば1秒間に60回更新できます。

FPSとリフレッシュレートの間には密接な関係があり、
たとえば100fps出せてもディスプレイのリフレッシュレートが30だったら1秒間に30回しか画面を更新できません。
反対に30fpsしか出ていないゲームでリフレッシュレートの高いディスプレイを使っても滑らかにはなりません。

テアリング

上述の通り、ディスプレイはリフレッシュレートに基づいて一定間隔で画面を更新します。
また、GPUは別の時間軸で描画内容の更新を続けます。

この二つの時間軸は異なるので、たとえばGPUがあるフレームを画面の半分だけ計算したタイミングで
ディスプレイが更新されてしまうと、画面の半分だけに最新フレームの情報が描画されて残りに一個前のフレームの情報が描画されてしまいます。

この現象をテアリングと言います。

V-Syncとスタッター

テアリングを防ぐためには、GPUであるフレームを処理したら、次にディスプレイが更新されるタイミングまでGPUの計算を止めます。
これはつまりリフレッシュレートにGPUの処理を同期させるということで、V-Syncと呼ばれます。

V-Syncを行うとテアリングは防げますが、GPUの処理が遅い場合にはスタッターと呼ばれるちらつきが起こります。

UnityとVSync

UnityではQuality SettingsでV-Syncの設定をできます。 V Sync CountをEvery V BlankにするとV-Syncが設定され、目標フレームレートがディスプレイの半分になります。
また、この場合はApplication.targetFrameRateを設定しても無視されます。

V-Syncを無効にしたい場合にはV Sync CountをDon't Syncに設定します。
この場合、Application.targetFrameRateの値が目標フレームレートとなります。
Application.targetFrameRateの値が-1だったらプラットフォームごとのデフォルト値が使われます。

参考

https://harukin.com/games/%E3%82%B2%E3%83%BC%E3%83%9F%E3%83%B3%E3%82%B0%E3%83%87%E3%82%A3%E3%82%B9%E3%83%97%E3%83%AC%E3%82%A4120hz144hz/

docs.unity3d.com

smartgames.hatenablog.com