UnityのInstantiate関数の速度を検証する
Instantiate関数でGameObjectを生成する際に、Prefabを元に生成するより、事前にSceneに配置したGameObjectを元に生成したした方が動作が早いという話を度々聞くので、本当に早いのか検証してみた。
結論から書くと
- Scene内に配置したGameObjectをInstantiateした方が、PrefabをInstantiateするより早い
- Prefabを一度Instantiateすると、以降同じPrefabをInstantiateする際は一度目よりも早く生成できる
検証方法
今回の検証は、UNITY-CHAN!の3DモデルをPrefabから/シーン内からInstantiateした時の時間を測るというもの。
Prefab or シーン内GameObjectを指定(target)して1秒間隔でInstantiateするスクリプトを書いた。
検証を数回行い、その都度Unityを起動し直すようにした。
今回、検証に使用したUnityのバージョンは4.5.0。
計測は、Profilerを使う。
検証結果 (実行速度)
PrefabをInstantiate : 6.5ms-7.5ms
Scene内のGameObjectをInstantiate : 2.0ms-3.0ms
検証した結果、PrefabからInstantiateするよりScene内のGameObjectをInstantiateした方が2-3倍速い事がわかった。
Instantiateを複数回行った場合
PrefabをInstantiate
一度目のInstantiateのみ、約7msかかっているが、以降のInstantiateは約2.5ms。
Prefabは2回目以降は早くInstantiateできる。Scene内のGameObjectをInstantiate
複数回実行しても約2.5msを維持している。
まとめ
- 規模の大きいGameObjectをInstantiateする場合は、事前にシーンの中に配置しておくと良いかも。
- InstantiateするGameObjectのサイズや、Instantiateする頻度や個数を見て、元となるGameObjectのあり方を見極める。
GameObjectをInstantiateするときは、「UnityでPrefabをInstantiateする時のGameObjectのActiveについて」も見ておくと良いかと思います。