GetComponent() 속도 재측정
10427 단어 Unity
그래서 이번에는 GetComponent()를 중심으로 검증을 진행했다.
Inspector 표시 순서가 GetComponent () 의 순서에 영향을 미친다고 가정하십시오.
즉, 원하는 구성 요소가 Target Component 클래스라면 위로 올라갈수록 속도가 빨라지는 것 아닌가.
Debug.Log() 및 Instantiate() 등의 속도를 측정해 보십시오.
스톱워치
며칠 전처럼 OngUI(OnGUI)를 측정하지 않기 때문에 Update(), LateUpdate()의 초시계를 사용했다.
이렇게 하면 출력 결과는 순수한 방법 처리 시간의 평균치가 된다.
따로 쓸 건 없지만 일단 코드부터 올려놔.
StopWatch.cs
using UnityEngine;
using System.Collections.Generic;
using System.Linq;
using System;
public class StopWatch : MonoBehaviour {
private int tick = 0;
private List<int> tickList = new List<int>();
void Update () {
tick = Environment.TickCount;
}
void LateUpdate()
{
var delta = Environment.TickCount - tick;
tickList.Add(delta);
// サンプリングを10000回.その後ログ出力.
if(tickList.Count == 9999)
{
Debug.Log("----- Average -----");
Debug.Log(tickList.Average().ToString("###.00"));
Debug.Break();
}
}
}
테스트 내용
테스트 내용은 다음과 같다.
● 1000개의 객체를 인스턴스화합니다.각 객체에는 GetComponentTest가 있습니다.첨부 cs
・ 모든 객체에 1000개의 구성 요소를 첨부합니다.
이제 GetComponent() 객체가 첨부 객체인지 또는 몇 번째 첨부인지 설정할 수 있습니다.
・첨부된 구성 요소의 컨텐트 비우기(TargetComponent.cs, DummyComponent.cs)
・초시계로 10000회 측정하여 평균치를 산출
TestManager.cs
using UnityEngine;
public class TestManager : MonoBehaviour {
[SerializeField]
private GameObject pref;
[SerializeField, ReadOnly]
private int testObjCount = 1000; // オブジェクト数.
private const int compCount = 1000; // Addするコンポーネント数.
[SerializeField]
private bool addTargetComponent = true; // GetComponent対象をAddするか
[SerializeField, Range(0, compCount)]
private int addIndex; // 何番目に対象コンポーネントをAddするか.
void Awake()
{
for (int i = 0; i < testObjCount; i++)
{
var go = Instantiate(pref) as GameObject;
go.AddComponent<GetComponentTest>();
for (int j = 0; j < compCount; j++)
{
AddTestComponent(go, j);
}
}
}
void AddTestComponent(GameObject go, int index)
{
if (addTargetComponent &&
index == addIndex)
{
go.AddComponent<TargetComponent>();
}
else
{
go.AddComponent<DummyComponent>();
}
}
}
GetComponentTest.csusing UnityEngine;
public class GetComponentTest : MonoBehaviour {
void Update () {
GetComponent<TargetComponent>();
}
}
TargetComponent.csusing UnityEngine;
public class TargetComponent : MonoBehaviour { }
DummyComponent.csusing UnityEngine;
public class DummyComponent : MonoBehaviour { }
결실
다음은 측정 결과입니다.
조금이라도 부착 대상자를 제외하면 1천번째(마지막) 부착보다 빠를 수 있지만, 조금 흔들릴 수 있어 무시할 수 있다.
측정 대상
처리 시간
대상을 첫자리에 붙이다
1.58ms
대상을 5위로 받다
1.82ms
대상을 100위로 받다
4.61ms
대상을 1000번째 위치에 연결하다
32.55ms
첨부되지 않은 객체
32.54ms
이상의 결과를 감안하여 GetComponent () 는 구성 요소를 대상에 부착하는 방법인지, 아니면 처음부터 찾는 방법인지 알 수 있습니다.나는 100개 이상의 부속품이 있을 수 없다고 생각한다.대상 없이 전체 검색에 필적할 수 있었던 것은 찾을 때까지 조사했기 때문이다.
전에 제 블로그에맞히다잘 됐다.
어쨌든, 빈번하게 접근하는 구성 요소는 위에 놓아야 한다.
Reference
이 문제에 관하여(GetComponent() 속도 재측정), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Gok/items/d2096c1369bb890ebbff텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)