[Unity] Find Ofjects Of Type과 Scene의 Root Game Objects에 대해 Get Components 중 어느 것이 더 빠릅니까?

11831 단어 Unity

결과


루트에서 잡아가는 게 빨라요.


Editor
방법
평균 처리 시간(ms)
FindObjectOfType
10.0
FindObjectsOfType
십일.0
RootGameObject
3.5
목록에 추가
3.0

standalone에서 developmentbuild+Autoconnect 프로필러
방법
평균 처리 시간(ms)
FindObjectOfType
6.5
FindObjectsOfType
6.9
RootGameObject
2.7
목록에 추가
2.7

대략적인 환경


windows7
Unity 2018.4.5f1
.net 4.x
.net standard 2.0
mono

측정 코드


profile.cs
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Profiling;
public class NewBehaviourScript : MonoBehaviour
{
    const string ROOT_GAMEOBJECT_NO_BUFFERED = "rootGameObjects no buffered";
    const string ROOT_GAMEOBJECT_BUFFERED = "root game object buffered";
    const string FIND_OBJECTS_TYPE = "find object's of type";
    const string FIND_OBJECT_TYPE = "find object of type";

    // Start is called before the first frame update
    void Start()
    {
        for (int i = 0; i < 1000; i++)
        {
            var go = new GameObject($"number {i}");
            for (int y = 0; y < 20; y++)
            {
                go.AddComponent<Type1>();
                go.AddComponent<Type2>();
            }
        }
    }

    private List<Type1> _Type1s = new List<Type1>();
    private List<GameObject> GameObjects = new List<GameObject>();
    private List<Type1> _Type1sBuffer = new List<Type1>();
    // Update is called once per frame
    void Update()
    {
        GC.Collect();
        {
            Profiler.BeginSample(ROOT_GAMEOBJECT_NO_BUFFERED);
            var rootGameObjects = gameObject.scene.GetRootGameObjects();
            Type1[][] type1s = new Type1[rootGameObjects.Length][];
            for (int i = 0; i < rootGameObjects.Length; i++)
            {
                type1s[i] = rootGameObjects[i].GetComponentsInChildren<Type1>();
            }
            Profiler.EndSample();
        }
        GC.Collect();
        {
            Profiler.BeginSample(ROOT_GAMEOBJECT_BUFFERED);
            gameObject.scene.GetRootGameObjects(GameObjects);
            for (int i = 0; i < GameObjects.Count; i++)
            {
                GameObjects[i].GetComponentsInChildren(_Type1sBuffer);
                _Type1s.AddRange(_Type1sBuffer);
            }
            Profiler.EndSample();
            _Type1sBuffer.Clear();
            _Type1s.Clear();
            GameObjects.Clear();
        }
        GC.Collect();
        {
            Profiler.BeginSample(FIND_OBJECTS_TYPE);
            var type1s = GameObject.FindObjectsOfType<Type1>();
            Profiler.EndSample();
        }
        GC.Collect();
        {
            Profiler.BeginSample(FIND_OBJECT_TYPE);
            var type1 = GameObject.FindObjectOfType<Type1>();
            Profiler.EndSample();
        }
    }
}

//別ファイルで定義
public class Type1 : MonoBehaviour
{
}
public class Type2 : MonoBehaviour
{
}

감상


처음 typo에서 단일 어셈블리를 주운 FindObjectOfType 사용()
그래도 Root의 Game Object를 모두 노출한 Get Components In Children () 녀석보다 늦었기 때문에
이 두 측정 결과는 모두 우연히 FindObject OfType () 과 FindObjects OfType () 의 속도에 큰 차이가 없는 놀라운 결과를 얻었다
FindObjectsOfType() 처리된 결과의 시작을 되돌리는 동작
무거운 거 알아요.
나는 단일한 사람도 초기화 중에 망설이는 처리 부하가 있을 것이라고 생각하지 않는다
Scene에서 Game Object를 다 가져와서 Get Components를 해보니까 무거웠나봐요.
나는 안에 어떤 실시가 있는지 모른다
비슷한 속도라면 별론인데, 왜 이렇게 느릴지 정말 수수께끼다

좋은 웹페이지 즐겨찾기