概要
最近Zenjectを使っていましたが、なんとなくInjectが重い気がしたので、具体的に動作速度を調べてみました。
調査方法
- PrefabにおけるFactory.Createの動作速度を調べたい
- 毎フレーム下記のPrefabをFactory.Create&Destroyを行ってグラフを見る
- 1個のGameObjectに対して、1個のComponent
- 201個のGameObjectに対して、1個のComponent
- 201個のGameObjectに対して、201個のComponent
- 1個のGameObjectに対して、201個のComponent
- ここで割増に使うComponentはInject属性を使っていない
コード
using Zenject;
public class TestInstaller : MonoInstaller
{
public override void InstallBindings()
{
Container.BindFactory<TestMonoBehaviour, TestMonoBehaviour.Factory>().FromComponentInNewPrefabResource("TestPrefab 3");
}
}
using UnityEngine;
using Zenject;
public class TestMonoBehaviour : MonoBehaviour
{
public class Factory : Factory<TestMonoBehaviour>
{
}
}
using UnityEngine;
using Zenject;
public class TestMain : MonoBehaviour
{
[Inject]
private TestMonoBehaviour.Factory _factory;
void Update ()
{
var obj = _factory.Create();
Destroy(obj.gameObject);
}
}
using UnityEngine;
public class TestMonoBehaviour2 : MonoBehaviour
{
}
using UnityEditor;
public class AutoMonoBehaviourSetter : Editor {
[MenuItem("Tools/Set MonoBehaviours")]
public static void SetMonoBehaviours()
{
for (var i = 0; i < 200; i++)
{
Selection.gameObjects[0].AddComponent<TestMonoBehaviour2>();
}
}
}
201個のGameObjectを刺したPrefab
201個のComponentを刺したPrefab
結果
1個のGameObjectに対して、1個のComponent
- 0.26ms
- 4.4KB Alloc
201個のGameObjectに対して、1個のComponent
- 1.08ms
- 4.4KB Alloc
201個のGameObjectに対して、201個のComponent
- 14.60ms
- 0.5MB Alloc
1個のGameObjectに対して、201個のComponent
- 11.62ms
- 484.8KB Alloc
まとめ
GameObject | Component | Time ms | GC Allock |
---|---|---|---|
1 | 1 | 0.26ms | 4.4KB |
201 | 1 | 1.08ms | 4.4KB |
1 | 201 | 11.62ms | 484.8KB |
201 | 201 | 14.08ms | 0.5MB |
- Inject属性を使っているかどうかに関わらず、Componentが増えるほどInjectが重くなる
- GameObjectの数は大して関係ないが、分散するよりは一つのGameObjectにまとめたほうが軽くなる