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だったらプラットフォームごとのデフォルト値が使われます。