unityでいってみよう!

unityがチョットワカル位の人のブログ

【2021年度版】UnityのTargetFrameRateについて

概要

TargetFrameRateとはアプリケーション全体の1フレーム(1ループ)を実行するのにどの位の時間をかけるかという目標時間です。 1フレームがこの時間より早く処理が終了した場合、目標時間が経過する迄待機してから次のフレームを開始します。 アプリケーションの1フレームの処理時間がこのTargetFrameRateに間に合わない場合、いわゆる処理落ちという状態になります。 TargetFrameRateを設定する意味は、1ループを更新する頻度を一定にするティアリングを防ぐなどの目的がありますが、ここではその説明は割愛します。 UnityではこのTargetFrameRateを設定する為の変数として名前そのもののApplication.targetFrameRateが存在しますが、実際にはApplication.targetFrameRateだけではなく、QualitySettings.VSyncCountの設定も影響を与えています。

QualitySettings.VSyncCountApplication.targetFrameRateの優先順位について

QualitySettings.VSyncCountApplication.targetFrameRateの優先度を比較した場合、QualitySettings.VSyncCount の方が優先度が高くなります。

QualitySettings.VSyncCount に0より大きい値が設定されていた場合

Application.targetFrameRateの値は無視されVSYNCをベースとした計算式が使用されます。

ターゲットフレームレート = Screen.currentResolution.refreshRate ÷ QualitySettings.VSyncCount

ターゲットフレームレートがリフレッシュレートによって変化していることに注意して下さい。 モバイルプラットフォームではリフレッシュレートが60[Hz]であることが一般的ですが、AndroidではSystem設定からリフレッシュレートを切り替えられる端末が数多く存在し、iPadProでも同様に60[Hz]<->120[Hz]を切り替えることが可能です。 フレームレートが上がれば、当然バッテリーの消費が上昇します。上記に記載したようにデフォルト値は60[Hz]になっている筈ですが、メーカーによっては120[Hz]が設定されていることがあり、それが問題になることもあるのでご注意下さい。

QualitySettings.VSyncCount に0以下の値が設定されていた場合

QualitySettings.VSyncCountの値は使用されなくなり、フレーム開始時からApplication.targetFrameRateの時間が経過する迄、フレームの末尾で待機します。 これは、VSYNC待ちを行わなくなるという意味にとれますが、一部のプラットフォームではそうでは無いことに注意して下さい。 例えば、プラットフォームがiOSの場合、ターゲットフレームレートが経過した次のVSYNCで次のフレームへ遷移します。 またこちらのフォーラムの内容をみるとUnity2021以降では、AndroidでもiOSと同じ挙動に合わせる予定があるようです。 Application.targetFrameRateの値が0以下の場合プラットフォームで処理が異なっています。

Application.targetFrameRateが0以下の場合

モバイルとそれ以外で挙動が異なります。

Android,iOSの場合

Android,iOSでは0以下の値を設定した場合、30となります。

ターゲットフレームレート = 30固定

その他のプラットフォーム

ターゲットフレームレート = Application.targetFrameRate

Application.targetFrameRateが1以上の場合

ターゲットフレームレート = Application.targetFrameRate

関連する過去記事

unityletsgo.hatenablog.com

unityletsgo.hatenablog.com