Unity で書き出した exe で意図しない無制限のフレームレートになった時に見るべきポイント
概要
アプリケーションが無制限のフレームレートになっているという報告を受け調査をしたところ、
QualitySettings.vSyncCount の設定の問題で意図しないフレームレートになっていたことが分かったのでその覚え書きです。
アプリケーション内でフレームレート制御の設定をしているはずなのになぜ?となっていましたが、外的要因があることが分かったのでまとめています。
結論
- ユーザー環境で垂直同期をオフにしていると、QualitySettings.vSyncCount を設定している場合に無制限なフレームレートになってしまう
- アプリケーション内で QualitySettings.vSyncCount に値を設定する場合、ユーザーに設定できる口を用意するべき
- Application.targetFrameRate を設定しても無視されることがあるので注意する
が結論です。
以降に解説していきます。
環境
Unity 2021.3.3f1
フレームレートの設定
Unity においてフレームレートを設定する際、
- QualitySettings.vSyncCount を設定する
- Application.targetFrameRate を設定する
が用いられると思います。
以下の記事にもそのような記述があります。
今回は、
- QualitySettings.vSyncCount に 1 を設定
- Application.targetFrameRate に 60 を設定
をしていた場合に、無制限のフレームレートになっている事象が報告されました。
なぜこうなっていたかを追っていきます。
Application.targetFrameRate
この値に任意の正数を設定すると、そのフレームレートで動作するようになります。
ただし、上記リンク内の targetFrameRate and vSyncCount の項目に記述があるのですが、vSyncCount の設定をすると Application.targetFrameRate の設定は 無視 されます。
そのため、開発側の意図しないフレームレートになる場合があります。
QualitySettings.vSyncCount
垂直同期数の設定です。
例えば、使用しているディスプレイのリフレッシュレートが 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