見出し画像

Setting FrameRate in Unity

はじめに

Unityでは、実行環境によって自動的にfps(フレームレート)が調整されます。
通常、「Objectの移動」などの処理は、Time.deltaTimeを使って実装しますが、fpsを固定することもできます。
実際は、fpsを固定した場合であっても、Frame間経過時間を用いた処理については、Time.deltaTimeを使って実装するのが、丁寧な実装ですが、
* Unity appのCPU占有率を下げたい
* 他のProcessと通信するので、fpsを(だいたい)合わせたい
場合もあるので、本稿を参考にして頂ければ、と思います。

環境

* MacBook Pro(Retina, 15-inch Mid 2015)
* Unity2018.2.2f1
* XCode v7.2

Steps

■Step1. Quality Settingsで垂直同期を変更

Unityのメニュー、Edit -> Project Settings -> Quality のインスペクタからVSync Countの項目を変更します。
デフォルトでは"Every VBlank"(垂直同期)が設定されておりますが、fpsを指定するには、これを"Don't Sync"(垂直同期無し)にします。

追記)
いつもこのstepを忘れる上、さらに悪いことには、Boot時のQualityごと、全てでこれを設定しなければならない。
面倒だし、絶対間違えるので、以下のように修正した。

// Awake()にて、
QualitySettings.vSyncCount = 0; // Don't Sync

とscriptから自動設定するよう、変更した(2018.11.15)

■Step2. script

scriptから、
Application.targetFrameRateを設定することでfpsを設定できます。
デフォルトでは-1。(スタンドアローンでは可能な限り早く、ウェブプレイヤーでは50~60FPS)
scriptのsourceは、GitHubにupしてあります。

Discussion

Step1で、VSync Countを"Every VBlank"にすると、script上で設定する値の速い遅いに関わらず、単にscriptの値が反映されませんできた(RefreshRate = 60Hzのmonitorでは、scriptによる 設定に関わらず常に60fps)。また、"Every second VBlank"では、fpsは、半分になります。

一方、openframeworks(以下、oF)では、少し動きが異なります。

oFでは、

ofSetVerticalSync(true);

とすると、monitorのリフレッシュレートよりも高いfpsを設定した場合のみ制限がかかり、これより低いfpsは、自由に設定が可能でした。つまり、monitorのリフレッシュレート = 60Hzとして、

ofSetVerticalSync(true);
ofSetFrameRate(120);

は、制限が掛かって、fps = 60になりますが、

ofSetVerticalSync(true);
ofSetFrameRate(50);

は、指定値の50fpsとなる、と言うことです。
fpsの設定値には、倍半分の制限もありませんでした。

Engineer's View Point

今回は、scriptだけでなく、project設定も必要なtipsでした。先走って、「scriptをattachして完了」としてしまうこともあるかと思いますが、きちんとtarget fpsになっているか、checkすれば、ミスに気付きます。

情報を鵜呑みにせず、実装したら必ずcheckする癖(当たり前なのですが・・・)を付けましょう。

参考文献/ URL

UnityでFPSを設定する方法

もしよろしければ、サポートをお願いします! 頂いたサポートは、Creatorとしての活動費に充てさせて頂きます。