おもしろいもの、やくにたつもの を かきこむのだ!

UnityのInstantiate関数の速度を検証する

Instantiate関数でGameObjectを生成する際に、Prefabを元に生成するより、事前にSceneに配置したGameObjectを元に生成したした方が動作が早いという話を度々聞くので、本当に早いのか検証してみた。

結論から書くと

  • Scene内に配置したGameObjectをInstantiateした方が、PrefabをInstantiateするより早い
  • Prefabを一度Instantiateすると、以降同じPrefabをInstantiateする際は一度目よりも早く生成できる

検証方法

今回の検証は、UNITY-CHAN!の3DモデルをPrefabから/シーン内からInstantiateした時の時間を測るというもの。
f:id:takashicompany:20140704032749p:plain

Prefab or シーン内GameObjectを指定(target)して1秒間隔でInstantiateするスクリプトを書いた。 f:id:takashicompany:20140704032918p:plain

検証を数回行い、その都度Unityを起動し直すようにした。
今回、検証に使用したUnityのバージョンは4.5.0。
計測は、Profilerを使う。

検証結果 (実行速度)

  • PrefabをInstantiate : 6.5ms-7.5ms
    f:id:takashicompany:20140704032813p:plain

  • Scene内のGameObjectをInstantiate : 2.0ms-3.0ms
    f:id:takashicompany:20140704032758p:plain

検証した結果、PrefabからInstantiateするよりScene内のGameObjectをInstantiateした方が2-3倍速い事がわかった。

Instantiateを複数回行った場合

  • PrefabをInstantiate f:id:takashicompany:20140704032822p:plain
    一度目のInstantiateのみ、約7msかかっているが、以降のInstantiateは約2.5ms。
    Prefabは2回目以降は早くInstantiateできる。

  • Scene内のGameObjectをInstantiate f:id:takashicompany:20140704032833p:plain
    複数回実行しても約2.5msを維持している。

まとめ

  • 規模の大きいGameObjectをInstantiateする場合は、事前にシーンの中に配置しておくと良いかも。
  • InstantiateするGameObjectのサイズや、Instantiateする頻度や個数を見て、元となるGameObjectのあり方を見極める。

GameObjectをInstantiateするときは、「UnityでPrefabをInstantiateする時のGameObjectのActiveについて」も見ておくと良いかと思います。