LoginSignup
0
0

More than 5 years have passed since last update.

MonoBehaviour調査2

Posted at

AddComponent / Destroy はどのくらい重い?

1.Update()のあるスクリプトをアタッチし続ける
2.Update()のあるスクリプトを必要に応じて、AddComponentして、不要になればDestroyする
3.Update()のあるスクリプトをアタッチし続け不要になればenable=falseにしてやる

1は論外として、速度的には3が一番速いだろうが、不要なコンポーネントを持ち続けるのが気持ち悪い。2のコストがどのくらいなのかを検証してみたい。

public class TestScript : MonoBehaviour {
    const int NUM = 10000;
    List<GameObject> go_;
    void Start () {
        go_ = new List<GameObject>();
        for( int i=0;i<NUM;i++ ) {
            var n = new GameObject("node"+i ); 
            go_.Add( n );
        }
    }
    void Update () {
        foreach( GameObject g in go_ ) {
            var c = g.AddComponent<WithoutUpdate>();
            Destroy( c );
        }
    }
}

空のGameObject10000個に対してスクリプトのAddComponent/Destroyを繰り返した。


順当に重い。DestroyImmediateでも変わらず。

スクリプトにStart() Awake()が存在するとAddComponent時に呼ばれるため更に遅い。

public class TestScript : MonoBehaviour {
    const int NUM = 10000;
    List<GameObject> go_;
    void Start () {
        go_ = new List<GameObject>();
        for( int i=0;i<NUM;i++ ) {
            var n = new GameObject("node"+i ); 
            var c = n.AddComponent<WithoutUpdate>();
            go_.Add( n );
        }
    }
    void Update () {
        bool e = false;
        foreach( GameObject g in go_ ) {
            var c = g.GetComponent<WithoutUpdate>();
            c.enabled = !c.enabled;
        }
    }
}

こんな具合にenabledを毎フレーム切り替えてみた場合


2に比べると圧倒的に速い。

動的にコンポーネントを生成破棄するのはやはりやめた方がよさそう。

知ってるようで確かめたことの無かった実験でした

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0