💻

Unity で書き出した exe で意図しない無制限のフレームレートになった時に見るべきポイント

2022/05/28に公開

概要

アプリケーションが無制限のフレームレートになっているという報告を受け調査をしたところ、
QualitySettings.vSyncCount の設定の問題で意図しないフレームレートになっていたことが分かったのでその覚え書きです。

アプリケーション内でフレームレート制御の設定をしているはずなのになぜ?となっていましたが、外的要因があることが分かったのでまとめています。

結論

  • ユーザー環境で垂直同期をオフにしていると、QualitySettings.vSyncCount を設定している場合に無制限なフレームレートになってしまう
  • アプリケーション内で QualitySettings.vSyncCount に値を設定する場合、ユーザーに設定できる口を用意するべき
  • Application.targetFrameRate を設定しても無視されることがあるので注意する

が結論です。
以降に解説していきます。

環境

Unity 2021.3.3f1

フレームレートの設定

Unity においてフレームレートを設定する際、

  • QualitySettings.vSyncCount を設定する
  • Application.targetFrameRate を設定する

が用いられると思います。
以下の記事にもそのような記述があります。

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

今回は、

  • QualitySettings.vSyncCount に 1 を設定
  • Application.targetFrameRate に 60 を設定

をしていた場合に、無制限のフレームレートになっている事象が報告されました。
なぜこうなっていたかを追っていきます。

Application.targetFrameRate

https://docs.unity3d.com/ja/2021.3/ScriptReference/Application-targetFrameRate.html

この値に任意の正数を設定すると、そのフレームレートで動作するようになります。
ただし、上記リンク内の targetFrameRate and vSyncCount の項目に記述があるのですが、vSyncCount の設定をすると Application.targetFrameRate の設定は 無視 されます。
そのため、開発側の意図しないフレームレートになる場合があります。

QualitySettings.vSyncCount

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

垂直同期数の設定です。
例えば、使用しているディスプレイのリフレッシュレートが 60Hz の場合に、

  • 1 を設定すると 60FPS に
  • 2 を設定すると 30FPS に

なります。

ただし、これは後述するユーザ環境での設定でこの通りにならない場合があります。
そのため、アプリケーション内で 1 を設定して固定するのは辞めておいたほうが良いです。

ユーザー環境での垂直同期の設定例

NVIDIA コントロールパネルで垂直同期の設定の変更が可能です。
グローバル設定内の垂直同期がこれにあたります。
これを オフ にすると、垂直同期が無効になります。

垂直同期が無効になっている状態で QualitySettings.vSyncCount が 0 以外になっていると、
無制限なフレームレートで描画されることを確認しています。

場合によっては 1000FPS を超えることもあり、PC に大きな負荷を与えることになります。
ので、QualitySettings.vSyncCount のみで FPS 制御をしてしまうのは問題になります。

解決方法

以上のため、アプリケーション内で QualitySettings.vSyncCount の設定をする場合、
ユーザー側でも設定できる場所を用意すると良いでしょう。
例えば、トグルボタンで 0 or 1 に設定する、みたいな設定を追加するなどです。

また、アプリケーション内でフレームレートを制御したい場合、
QualitySettings.vSyncCount の設定だけでなく、Application.targetFrameRate も設定すると良いでしょう。

Discussion