Unity の Update() 呼び出しは遅い
検証したマシンは Ryzen 5 2600、メモリは 16 GB。
空の Update() を持つオブジェクトがシーンに 100,000 個ある場合、Update() を呼び出すだけで 42ms かかっている。
Update() を削除して自作の OnUpdate() を定義し、マネージャクラスから直接呼び出した場合は、100,000 個で 3.7 ms しかかからない。
マネージャクラスの作成
大量のオブジェクトを更新する場合は、自作の管理クラスを作ったほうがいい。
実装例
Update が必要なオブジェクトは以下のような IUpdatable を継承する。
public interface IUpdatable{
void OnUpdate(float delta_time);
}
オブジェクトからデフォルトの Update() を削除し OnUpdate を実装する。Start() でマネージャクラスに登録する。
public class SomeObject : MonoBehaviour, IUpdatable{
void Start(){
ObjectManager.GetInstance().Register(this);
}
public void OnUpdate(float delta_time){
}
}
マネージャクラスは以下のようになる。完全なシングルトンではなく、エラー処理もしていないので注意。
public class ObjectManager : MonoBehaviour
{
private static ObjectManager _instance;
public static ObjectManager GetInstance(){
return _instance;
}
private List<IUpdatable> objects;
public int max_object_count;
void Awake(){
_instance = this;
objects = new List<IUpdatable>(max_object_count);
}
public void Register(IUpdatable o){
objects.Add(o);
}
public void Unregister(IUpdatable o){
objects.Remove(o);
}
void Update(){
float dt = Time.deltaTime;
for(int i=0; i < objects.Count; ++i){
objects[i].OnUpdate(dt);
}
}
}