dskjal
広告
広告

Unity の Update() 呼び出しは遅い

カテゴリ:unity

検証したマシンは 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);

}

}

}


広告
広告

カテゴリ