Unity – 細かく「Update」Part.2

前回のつづき。

Unity4.18f1を使っています

Update()は毎フレーム呼ばれる

Update()は毎フレーム呼ばれる。Update()には重い処理は記述しない。

ここまでは前回の通りだが、
では、軽い処理のUpdate()の数が多くなったらどうだろうか。
試しに負荷テストをしてみる。

手順

  1. 前回のプロジェクトのCubeをPrefab化し、Hierarchy上から削除する
  2. HierarchyにCreateEmptyをし”CubeFluctuater”に名前を変更する
  3. “CubeFluctuater”に新しいスクリプトCubeFluctuater.csをアタッチする
  4. CubeFluctuater.csをコーディングする
  5. Inspector上でCubeFluctuater.csに1.で作ったPrefabをセットする
  6. cubePrefabの値やCubeを変化させる

詳細

前回のプロジェクトのCubeをPrefab化する。

Hierarchy上のCubeを削除する。

HierarchyにCreateEmptyで空オブジェクトを作り”CubeFluctuater”に名前を変更する。

CubeFluctuaterに新しいスクリプト”CubeFluctuater.cs”をアタッチする。CubeFluctuaterは、int targetQuantityの数値になるようにCubeを生成したり削除したりする

using System.Collections.Generic;
using UnityEngine;

public class CubeFluctuater : MonoBehaviour {
    [Header("Cubeの数をいくつにするか")]
    [Range(1,100)]
    [SerializeField] int targetQuantity = 5;

    [Header("CubeのPrefab")]
    [SerializeField] GameObject cubePrefab;

    //Cubeを管理するコレクション
    Queue<GameObject> cubes = new Queue<GameObject>(1000);

    //フレーム毎にCubeの数を目標数に合わせていく
	void Update () {
        //Cubeの数を取得
        var quantity = cubes.Count;

        //Cubeの数に応じてCubeを増減させる
        //Cubeが少ない場合
        if (quantity < targetQuantity) {
            //Cubeを生成し親子関係にする
            var cube = Instantiate(cubePrefab, this.transform);
            //生成したCubeをcubesに加える
            cubes.Enqueue(cube);
        //Cubeが多い場合
        }else if(quantity > targetQuantity) {
            //Cubeをcubesから取り出す
            var cube = cubes.Dequeue();
            //取り出したCubeを削除する
            Destroy(cube);
        }
    }
}

Inspector上での値を調整する。
まずCubeFluctuater.csに最初に作ったCubeのPrefabをセット。

続いてCubeのPrefabのHeavyProcess.csの単体の負荷率をセット。

実行する。Inspector上の値は実行しながらでも変更できるので、負荷によるfpsの変化の様子を見る。


[画像左下fps]

僕の環境ではprocessCountが10のCubeが10個を超えるとfpsは15を下回る・・・といった感じでやはりfpsに大きな影響を与えているのがわかります。

パフォーマンスを保つためにも用が済んだGameObjectは速やかに消すことは大事そうです。

次回へ続く

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です