Unityのデフォルト状態でのフレームレート(FPS)は、可能な限り早い状態になるよう設定されています。

ただデバッグでフレームレート(FPS)が遅くなった時を再現したい時など、フレームレート(FPS)を固定したい場面はしばしばあります。
今回はフレームレートを固定する方法についてお話しします。
実行環境
Unity2022.3.18f1
方法
void Awake()
{
Application.targetFrameRate = 60; // 初期状態は-1になっている
}

一部プラットフォームの場合は下記の設定も必要になります。
- QualitySettings.vSyncCountの設定をする
- ProjectSettingsからVSync Count設定をDon’t Syncにする
void Awake()
{
QualitySettings.vSyncCount = 0; // 垂直同期の回数
}

ただし、VSync(垂直同期)設定については注意が必要なので、補足説明の方で説明します。
また、Unityデフォルトの機能でのFPS設定よりも精度を上げるため、コルーチンによる実装を行っている例もありました。
補足説明
VSync(垂直同期)/vSyncCountとは?
VSync(垂直同期)
自分はあまりVSync(垂直同期)について知らなかったので、少し調べてみました。
垂直同期(VSYNC)は、パソコンから出力されたグラフィック情報が、モニター側に送られた際に表示能力の限界を超えないように調整する機能となります。
VSYNCはVertical Synchronizing signalの略となり、各単語の訳は以下になります。
- Vertical:垂直
- Synchronizing:同期
- signal:信号
https://www.dospara.co.jp/5info/cts_str_pc_versynch.html
引用元によると、ソフトウェア側からのグラフィック出力のタイミングをモニターのリフレッシュレートに上手く合わせることで映像の表示がおかしく(ティアリング)ならないようにする機能のようです。
そのため、もしVSync(垂直同期)設定を外す場合、ティアリングによる映像の乱れが発生してしまう可能性があるため注意が必要そうです。
vSyncCount
When you use
https://docs.unity3d.com/ScriptReference/QualitySettings-vSyncCount.htmlvSyncCount, Unity calculates the target frame rate by dividing the platform’s default target frame rate by the value ofvSyncCount. For example, if the platform’s default render rate is 60 fps andvSyncCountis 2, Unity tries to render the game at 30 frames per second.
と書いてある通り、vSyncCountが効く設定の場合UnityはプラットフォームのターゲットフレームレートをvSyncCountの値で割って最終的なターゲットフレームレートを決定するそうです。
ここでいうプラットフォームのターゲットフレームレートとは、恐らくディスプレイなどのリフレッシュレートのことだと思われます。
そのため、ディスプレイのリフレッシュレートが120FPSで、vSyncCountが2の場合、最終的に60FPSでレンダリングされます。
targetFrameRateとvSyncCountの競合について
Mobile platforms ignore
vSyncCount. On mobile devices, when a frame is ready, it displays the next time the screen refreshes. You can use Application.targetFrameRate to control the frame rate on mobile platforms.VR platforms ignore
vSyncCount. Instead, the VR SDK controls the frame rate.On all other platforms, Unity ignores the value of
https://docs.unity3d.com/ScriptReference/QualitySettings-vSyncCount.htmltargetFrameRateif you setvSyncCount.
と書いてある通り、
- モバイルプラットフォームではvSyncCountは無視され、targetFrameRateを使用してFPSを制御できる
- VRプラットフォームではvSyncCountは無視され、VR SDK側でFPSを制御する
- その他のプラットフォームではvSyncCountが設定されている場合、targetFrameRateが無視される
のように各プラットフォーム毎に各設定が効くかどうか決まっており、どっちも効く場合はvSyncCountが優先されるらしいです。


コメント