【Unity】フレームレート(FPS)を固定する方法

Tips

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

初期状態で実行した時のFPS

ただデバッグでフレームレート(FPS)が遅くなった時を再現したい時など、フレームレート(FPS)を固定したい場面はしばしばあります。

今回はフレームレートを固定する方法についてお話しします。

スポンサーリンク

実行環境

Unity2022.3.18f1

方法

void Awake()
{
    Application.targetFrameRate = 60; // 初期状態は-1になっている
}
おおよそ60FPSで実行される

一部プラットフォームの場合は下記の設定も必要になります。

void Awake()
{
    QualitySettings.vSyncCount = 0;  // 垂直同期の回数
}
Edit > Project Settings > Quality > VSync Count

ただし、VSync(垂直同期)設定については注意が必要なので、補足説明の方で説明します。

また、Unityデフォルトの機能でのFPS設定よりも精度を上げるため、コルーチンによる実装を行っている例もありました。

https://blog.unity.com/ja/engine-platform/precise-framerates-in-unity

補足説明

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 vSyncCount, Unity calculates the target frame rate by dividing the platform’s default target frame rate by the value of vSyncCount. For example, if the platform’s default render rate is 60 fps and vSyncCount is 2, Unity tries to render the game at 30 frames per second.

https://docs.unity3d.com/ScriptReference/QualitySettings-vSyncCount.html

と書いてある通り、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 targetFrameRate if you set vSyncCount.

https://docs.unity3d.com/ScriptReference/QualitySettings-vSyncCount.html

と書いてある通り、

  • モバイルプラットフォームではvSyncCountは無視され、targetFrameRateを使用してFPSを制御できる
  • VRプラットフォームではvSyncCountは無視され、VR SDK側でFPSを制御する
  • その他のプラットフォームではvSyncCountが設定されている場合、targetFrameRateが無視される

のように各プラットフォーム毎に各設定が効くかどうか決まっており、どっちも効く場合はvSyncCountが優先されるらしいです。

Tips小ネタ&小技
スポンサーリンク
フーシャ

主にUnityを触ってるクライアントエンジニア。
学部の情報工学科卒業後、
スマホ向けゲームの開発/運営会社に新卒で入社して現在5年目の社会人です。

フーシャをフォローする
フーシャをフォローする

コメント

タイトルとURLをコピーしました