前回のつづき。
Unity4.18f1を使っています
Update()は毎フレーム呼ばれる
Update()は毎フレーム呼ばれる。Update()には重い処理は記述しない。
ここまでは前回の通りだが、
では、軽い処理のUpdate()の数が多くなったらどうだろうか。
試しに負荷テストをしてみる。
手順
- 前回のプロジェクトのCubeをPrefab化し、Hierarchy上から削除する
- HierarchyにCreateEmptyをし”CubeFluctuater”に名前を変更する
- “CubeFluctuater”に新しいスクリプトCubeFluctuater.csをアタッチする
- CubeFluctuater.csをコーディングする
- Inspector上でCubeFluctuater.csに1.で作ったPrefabをセットする
- 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は速やかに消すことは大事そうです。
次回へ続く