Unity를 개발하다보면 잦은 GetComponent 호출은 성능을 크게 떨어뜨린다는 말을 자주 듣습니다.
'그렇다면 GetComponent는 얼마나 느릴까요?'
오늘은 이 궁금증을 해결하기 위해 실험을 준비했습니다 :)
GetComponent 성능 실험
실험 구성은 다음과 같다.
1. Unity 빈 프로젝트 환경 구성
2. 단순 연산을 N번 돌렸을 때, 1ms가 나오는 N을 선택
3. Update 함수에서 N번의 GetCompoent 돌려서 성능 체크
바로 시작해보자.
Scene에는 카메라, 직사광선, 그리고 테스트용 스크립트가 있음
테스트용 스크립트에는 특정 액션의 수행 시간을 체크하는 메서드를 보유함
public void MeasurePerformance(Action action, int loopCount)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < loopCount; i++)
action();
stopwatch.Stop();
UnityEngine.Debug.Log($"측정 결과: {stopwatch.ElapsedMilliseconds} ms 경과");
}
MeasurePerformance 메서드
action을 loopCount만큼 반복문을 수행하는데 걸리는 시간을 측정하여 로그를 찍음
그럼 이제 기준을 정해보겠음
MeasurePerformance(() => { sum = 1 + 2; }, 1000000);
먼저, 덧셈을 하여 변수에 저장하는 간단한 코드에 대해 측정 시작
하지만 100만번이나 반복문을 한 프레임 내로 처리할 예정
과연 결과는..?
Update에서 돌리니 측정 결과가 평균적으로 1 ~ 2 ms 사이가 나옴
그럼 이제 이걸 기준으로 GetComponent를 돌려보도록 하겠음
MeasurePerformance(() => { this.GetComponent<SpriteRenderer>(); }, 1000000);
과연 결과는..?
..?! GetComponent 비용이 단순 연산 비용의 50배 정도의 비용이 발생
GetComponent가 오브젝트 내 컴포넌트의 개수에 영향이 있을 수 있으니
이번에는 오브젝트에 컴포넌트를 10개로 세팅 시작
끔찍한 혼종 완성
자 그럼 과연 실험 결과는?
별 차이가 없음
아무래도 Sprite Renderer가 가장 위에 있어서 반환하고 종료할 수 있다는 생각이 들었음
그래서 Sprite Renderer 컴포넌트를 가장 마지막에 위치시키고 다시 실행
하지만 결과는 동일
선형 탐색으로 모든 컴포넌트를 순회할 것이라 예상했는데 아닌건가?
GetComponent 함수 내부의 동작을 살펴보려고 해도 Unity 엔진 내부는 C++ 네이티브로 구성되어 있기에 분석을 못함...
아마 Unity의 내부 캐싱, 최적화된 검색 로직이 존재하지 않을까 생각함
추가 성능 실험
번외로, 다른 함수들도 실험해보니 다음과 같은 결과가 나왔다.
(sum = 1 + 2 작업 비용은 1ms)
1. Field Cashing: 7 ~ 8 ms
2. object(boxing): 7 ~ 8 ms
3. TryGetComponent: 100 ms
4. AddComponent: 50000 ms
AddComponent의 비용은 매우 놀라웠다.
무려 50초의 시간이라니...
AddComponent 비용이 GetComponent 비용의 1,000배이다.
(일반 연산의 50,000배)
GetComponent 보다 AddComponent가 훨씬 비용이 크다.
그러긴 AddComponent는 왠만하면 거의 쓰지 않는 것이 좋겠음
아무튼 결론은...
GetComponet 비용은 생각보다 크다는 점
(sum = 1 + 2 작업 비용의 50배)
그리고 AddComponent는 절대 지양하도록 하자.
💡 참고 자료
[ GetComponent 최적화 기법 ]
'유니티(Unity) > 이론 정리' 카테고리의 다른 글
[Unity Korea] 객체 지향 설계 원칙 (SOLID) (0) | 2024.11.12 |
---|---|
클래스 이름 짓기 [ 2편 ] + MVC 패턴 (2) | 2024.11.11 |
클래스 이름 짓기 [ 1편 ] (1) | 2024.11.10 |
에셋 번들(Asset Bundle) 이론 정리 (1) | 2024.03.27 |
싱글톤(Singleton) 패턴 (0) | 2024.03.22 |