[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.csusing 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를 해보니까 무거웠나봐요.
나는 안에 어떤 실시가 있는지 모른다
비슷한 속도라면 별론인데, 왜 이렇게 느릴지 정말 수수께끼다
Reference
이 문제에 관하여([Unity] Find Ofjects Of Type과 Scene의 Root Game Objects에 대해 Get Components 중 어느 것이 더 빠릅니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Basuhei_Acheron/items/32377cf74a15479b1baa
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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를 해보니까 무거웠나봐요.
나는 안에 어떤 실시가 있는지 모른다
비슷한 속도라면 별론인데, 왜 이렇게 느릴지 정말 수수께끼다
Reference
이 문제에 관하여([Unity] Find Ofjects Of Type과 Scene의 Root Game Objects에 대해 Get Components 중 어느 것이 더 빠릅니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Basuhei_Acheron/items/32377cf74a15479b1baa
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여([Unity] Find Ofjects Of Type과 Scene의 Root Game Objects에 대해 Get Components 중 어느 것이 더 빠릅니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Basuhei_Acheron/items/32377cf74a15479b1baa텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)