17
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Zenjectの動作速度を検証した

Last updated at Posted at 2017-04-03

概要

最近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

SnapCrab_NoName_2017-3-28_14-10-7_No-00.png (14.2 kB)

201個のComponentを刺したPrefab

SnapCrab_NoName_2017-3-28_10-5-13_No-00.png (51.5 kB)

結果

1個のGameObjectに対して、1個のComponent

  • 0.26ms
  • 4.4KB Alloc
SnapCrab_NoName_2017-3-28_9-34-20_No-00.png (136.6 kB)

201個のGameObjectに対して、1個のComponent

  • 1.08ms
  • 4.4KB Alloc
SnapCrab_NoName_2017-3-28_9-36-56_No-00.png (144.7 kB)

201個のGameObjectに対して、201個のComponent

  • 14.60ms
  • 0.5MB Alloc
SnapCrab_NoName_2017-3-28_9-38-20_No-00.png (158.3 kB)

1個のGameObjectに対して、201個のComponent

  • 11.62ms
  • 484.8KB Alloc
SnapCrab_NoName_2017-3-28_14-18-22_No-00.png (138.9 kB)

まとめ

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にまとめたほうが軽くなる
17
10
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
17
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?