WisdomSoft - for your serial experiences.

フレームレートの設定

1 秒間に生成されるフレーム数(フレームレート)をスクリプトから制御する方法を紹介します。

フレーム更新間隔の制御

1 秒間に Update() メソッドが呼び出される回数は、Unity の設定によって変化します。この回数はスクリプトから調べたり、制御することも可能です。

アプリケーションに関する全般的な情報は UnityEngine.Application クラスによって提供されます。

UnityEngine.Application クラス
public sealed class Application

1 秒間に生成する目標フレーム数、すなわちフレームレートは targetFrameRate プロパティで表されます。

Application クラス targetFrameRate プロパティ
public static int targetFrameRate { get; set; }

このプロパティのデフォルトは -1 に設定されています。-1 の場合、実行環境のエンジンが最適なフレームレートを選択します。スタンドアロンのゲームであれば可能な限り描画を繰り返す可変フレームレートであることを表します。

もちろん、このプロパティに設定されたフレームレートは参考であり、ゲームの実行環境によっては、パフォーマンスや電源環境によって指定したフレームレートを実現できない可能性があります。ゲームが要求するフレームレートを満たしているかどうかは、実機でパフォーマンスをテストしなければなりません。

例えば targetFrameRate プロパティに 10 を設定すると 1 秒間に 10 フレームが生成される、すなわち Update() メソッドが 1 秒間に 10 回のペースで呼び出されることが期待できます。ただし、デフォルトのプロジェクトの構成では targetFrameRate の値を変更しても効果が表れないでしょう。おそらく 60 フレーム/秒で固定されているはずです。

コード1
using UnityEngine;

public class Test : MonoBehaviour 
{
	void Start()
	{
		Application.targetFrameRate = 10;
	}
	void Update() 
	{
		float yr = 20 * Time.deltaTime;
		transform.Rotate(0, yr, 0);
		if (Time.frameCount % Application.targetFrameRate == 0)
		{
			print("FPS=" + 1 / Time.deltaTime);
		}
	}
}
実行結果

コード1は targetFrameRate プロパティに 10 を設定し、Update() メソッドの 1 秒間の呼び出し回数を deltaTime プロパティから予測して出力しています。この結果が 60 前後で固定されている場合、フレームの更新が垂直同期周波数によって固定されています。

垂直同期周波数、通称 vSync と呼ばれるこの設定は、物理的なディスプレイの画面更新に同期してフレームを生成することを表します。リフレッシュレートと呼ぶこともあります。通常、この設定は有効化されているため targetFrameRate プロパティの要求よりも垂直同期周波数に合わせてフレームが生成されます。

この設定を変更するには Unity エディタの「Edit」メニューから「Project Settings」項目内にある「Quality」項目を選択します。「Inspector」ウィンドウに「Quality Settings」が表示されるので、この中からプロジェクトに設定されている構成(デフォルトでは Good)を展開してください。一覧の中にある「VSync Count」が垂直同期に関する設定となります。

図1 垂直同期の設定
垂直同期の設定

この項目を変更しようとするとドロップダウンメニューが表示されます。「Don't Sync」が垂直同期しないことを表します。デフォルトは垂直同期することを表す「Every VBlank」に設定されています。「Every Second VBlank」は垂直同期の半分を表します。通常、「Every VBlank」を設定した場合は 60 フレーム/秒、「Every Second VBlank」を設定した場合は 30 フレーム/秒となるでしょう。

垂直同期を無効にするメリットは大きくありませんが、コード1のようなフレームレートのテストを行う場合や、動きの少ないゲームであれば、モバイル環境のためにフレームレートを下げて消費電力を削減するなどの応用が考えられます。