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に比べると圧倒的に速い。
動的にコンポーネントを生成破棄するのはやはりやめた方がよさそう。
知ってるようで確かめたことの無かった実験でした