2017年5月19日

Unity fpsを変更する


スクリプトからフレームレートを固定する方法を紹介…


※このページの内容の動作確認にはUnity5.3を使用しています。
フレームレートはゲームの要!そもそもfps(frames per second)というのは「1秒間あたりに何回更新処理を行うか(画面を描画するか)」を示すものですが、場合によっては単に見た目がカクついたりするだけでなく、ゲームプレイそのものにも影響が出る可能性があるものです。たとえばSkyrimやFallout4などで使用されているベセスダのCreation Engineなんかは「フレームレートを極端に上げるとオブジェクトそのものの動作やアニメーションの速度がおかしくなる」と一部で話題になったりしました。

特にPCやモバイルなどでは、ある環境では120fpsも余裕で出るけど別の環境では15fpsしか出ない、なんていうことも起こりえます(家庭用ゲーム機であればそこまでバラけることはないですが…)。そういう可能性も想定して、かなり低いフレームレートでも一応狙ったとおりの動作をするか確かめておく必要があります。

というわけで、特定のフレームレートに固定した状態でプレイできるクラスを作ってみましょう。

public class SetFrameRate : MonoBehaviour {

 public int targetFrameRate = -1;
 void Awake() {
  if(targetFrameRate > 0) {
   QualitySettings.vSyncCount = 0;
   Application.targetFrameRate = targetFrameRate;
  }
 }
}

まず6行目の

QualitySettings.vSyncCount = 0;

という箇所でVSyncを一旦オフにしています。VSyncというのは「モニターのリフレッシュレート(つまり画面を更新するタイミング)に合わせてゲーム画面を描画する」機能のことですね。一般的なモニターであれば60fpsないし30fpsに固定されるのですが、今回はその機能は邪魔なので切ってしまいます。ちなみに、UnityのメニューからEdit→Project Settings→QualityとすすんでV Sync Countの項目をDon't Syncに変更すれば手動でもオフにすることができます。

そして次の

Application.targetFrameRate = targetFrameRate;

という行で指定したフレームレートに変更しているわけです。処理としてはこれだけです。

ためしにtargetFrameRateを1とか2とか極端に低い値にしてプレイしてみると、意外なバグが見つかるかもしれません。例えば「オブジェクトを回転させて特定の角度に近づいたら停止する」という処理をしていた場合、もしかしたら1フレームの間に移動する角度が大きすぎて狙ったところで止まってくれない、なんて事態になることも。

それから、この方法で影響をうけるのはUpdate()やTime.deltaTimeなどフレームレートに対応した処理のみです。FixedUpdate()やTime.fixedDeltaTimeなどPhysics系の処理は基本的にフレームレートに依存しないので影響をうけません。物理計算のタイミングを変えたーい!という場合はEdit→Project Settings→TimeからFixed Timestepの値を変更しましょう。

0 件のコメント:

コメントを投稿