본문 바로가기

카테고리 없음

Unity에서 Update 최적화 실험

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