GetComponent() 속도 재측정

10427 단어 Unity
며칠 전.이 글에서 나는 평소에 사용하는 방법의 속도를 측정해 보았는데, 그 중 하나가 매우 마음에 걸렸다.GetComponent()는 객체가 있는 경우와 없는 경우의 속도가 다릅니다.
그래서 이번에는 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.cs
using UnityEngine;

public class GetComponentTest : MonoBehaviour {
    void Update () {
        GetComponent<TargetComponent>();
    }
}
TargetComponent.cs
using UnityEngine;

public class TargetComponent : MonoBehaviour { }
DummyComponent.cs
using UnityEngine;

public class DummyComponent : MonoBehaviour { }

결실


다음은 측정 결과입니다.
조금이라도 부착 대상자를 제외하면 1천번째(마지막) 부착보다 빠를 수 있지만, 조금 흔들릴 수 있어 무시할 수 있다.
측정 대상
처리 시간
대상을 첫자리에 붙이다
1.58ms
대상을 5위로 받다
1.82ms
대상을 100위로 받다
4.61ms
대상을 1000번째 위치에 연결하다
32.55ms
첨부되지 않은 객체
32.54ms
이상의 결과를 감안하여 GetComponent () 는 구성 요소를 대상에 부착하는 방법인지, 아니면 처음부터 찾는 방법인지 알 수 있습니다.나는 100개 이상의 부속품이 있을 수 없다고 생각한다.대상 없이 전체 검색에 필적할 수 있었던 것은 찾을 때까지 조사했기 때문이다.
전에 제 블로그에맞히다잘 됐다.
어쨌든, 빈번하게 접근하는 구성 요소는 위에 놓아야 한다.

좋은 웹페이지 즐겨찾기