Unity에서 Update() 최적화 실험: 어떤 방식이 가장 빠를까?
Unity에서는 오브젝트의 동작을 매 프레임 업데이트하기 위해 Update()를 많이 사용합니다. 하지만 Update()를 무작정 사용하면 성능 저하를 유발할 수 있습니다. 이번 포스팅에서는 Update()를 실행하는 다양한 방법을 비교하고, 가장 효율적인 방식을 찾아보겠습니다.
1. 실험 방법
세 가지 방식으로 Update()를 실행하고, Stopwatch를 이용해 성능을 측정했습니다.
1. 기본 Unity Update() 방식
- MonoBehaviour에서 제공하는 기본적인 Update()를 사용합니다.
- Unity 엔진이 자동으로 매 프레임마다 호출합니다.
2. Coroutine을 이용한 방식
- WaitForEndOfFrame()을 사용하여 매 프레임마다 실행됩니다.
- Update()와 다르게 Unity의 내부 최적화를 활용할 수 있습니다.
3. Update Manager 방식
- Update()를 개별적으로 호출하는 대신, CustomUpdate 인터페이스를 활용하여 하나의 Update()에서 직접 관리하는 방식입니다.
- Unity의 MonoBehaviour 시스템을 거치지 않고 C# 레벨에서 처리됩니다.
측정 방식
Update()와 LateUpdate() 사이의 시간을 Stopwatch로 측정
2. 실험 결과
방식실행 시간
1. 기본 Unity Update() | 3.4ms |
2. Coroutine (WaitForEndOfFrame) | 0.14ms |
3. Update Manager 방식 | 0.01ms |
결과를 보면, 기본 Update() 방식이 3.4ms로 가장 느렸고, Coroutine 방식은 0.14ms, Update Manager 방식은 0.01ms로 가장 빨랐습니다.
3. 분석: 왜 이런 차이가 날까?
1. Unity 기본 Update()가 가장 느린 이유
- Update()는 각각의 MonoBehaviour마다 실행됩니다.
- Unity 엔진이 C++과 C#을 오가는 비용(브릿지 오버헤드)이 발생합니다.
- 개체가 많아질수록 성능이 급격히 저하됩니다.
2. Coroutine 방식이 상대적으로 빠른 이유
- WaitForEndOfFrame()을 사용하면 Unity의 프레임 렌더링 이후에 실행됩니다.
- Unity 엔진이 최적화하여 처리하므로 Update()보다는 효율적입니다.
3. Update Manager 방식이 가장 빠른 이유
- Update()를 MonoBehaviour에서 직접 호출하지 않고, C# 코드 내부에서 리스트로 관리합니다.
- Unity 엔진을 거치지 않기 때문에 최대한의 성능을 보장합니다.
4. 결론 및 최적화 방법
1. 많은 개체에서 Update()를 사용해야 한다면 → Update Manager 방식을 사용하라!
- 개별 Update()를 없애고, 하나의 매니저에서 필요한 오브젝트만 업데이트하면 성능이 크게 향상됨.
2. 특정 타이밍 제어가 필요하면 Coroutine을 활용하라.
- WaitForSeconds()로 일정 시간 간격 실행.
- WaitForEndOfFrame()을 활용해 프레임 종료 후 실행.
3. 적은 개체에서는 그냥 MonoBehaviour.Update()를 써도 괜찮다.
- 소수의 오브젝트라면 큰 차이가 없으므로 단순한 방법을 사용해도 됨.
⚡ 결론: Update() 남용하지 말고, Update Manager 패턴을 적극 활용하자!
728x90