広告
広告

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);
        }
    }
}

広告
広告