일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- desgin
- 프로그래밍
- 디자인 패턴
- 2번
- pattern
- 성능
- 문제풀이
- A*
- ML Agent
- 디자인패턴
- 디자인
- Algorithm
- 인공지능
- 팩토리
- AI
- 게임
- 머신러닝
- GetComponet
- 길 찾기
- 알고리즘
- C++
- JPS
- Factory
- LeetCode
- 강의
- 개발
- Design
- 패턴
- 유니티
- Unity
- Today
- Total
Game Development
Unity Update 호출할 때, 사용되는 비용! 본문
Update 호출 시, 소모되는 비용!
해당 실험은 2015년 말쯤에 타 블로그에서 1만번 업데이트 호출하는 테스트에 대한 글이 올라와 있습니다.
해당 실험을 현 시점 다시 진행해 볼려고 합니다.
또한 타 블로그에서 진행되었던 테스트가 신기하여 따라하고 포스팅 하는것 입니다.
이 Update함수를 코드 상에 적어두기만 해도 Update를 계속 호출하기에 많은 비용을 먹게 된다는 말입니다.
테스트
Update 호출의 비용을 알아보기 위해 테스트를 진행하는데, 1만개의 업데이트를 호출하는데 걸리는 시간을 체크해보도록 하겠습니다.
총 3가지의 테스트를 진행해보도록 하겠습니다.
1. Unity Update Message를 이용한 방식
private void Update()
{
count++;
}
2. Coroutine을 이용한 방식
private void Start()
{
StartCoroutine( UpdateCor() );
}
private IEnumerator UpdateCor()
{
while ( true )
{
yield return new WaitForEndOfFrame();
}
}
3. Update Maanger를 이용한 방식
interface CustomUpdate
{
void CustomUpdate();
}
private CustomUpdate[] customUpdates;
private void Update()
{
foreach( var update in customUpdates )
{
update.CustomUpdate();
}
}
시간 측정
Update 콜과 LateUpdate 콜 사이의 시간을 Stopwatch로 측정했습니다.
private void Update()
{
if ( Time.time < startTime )
return;
sw.Start();
}
private void LateUpdate()
{
if ( Time.time < startTime )
return;
sw.Stop();
updateCount++;
frameTime = sw.ElapsedTicks;
totalTime += frameTime;
sw.Reset();
}
private IEnumerator Log()
{
WaitForSeconds delay = new WaitForSeconds(1f);
while ( true )
{
yield return delay;
if ( updateCount > 0 )
{
UnityEngine.Debug.Log( $"{ totalTime / updateCount / Stopwatch.Frequency * 1000 } {frameTime / Stopwatch.Frequency * 1000} ");
}
}
}
테스트 결과
결과가 충격적입니다.
1번 Unity Update Message를 이용한 방식 3.4ms
2번 Corutine을 이용한 방식 0.14ms
3번 업데이트 매니저를 이용한 방식 0.01ms
1. 일반적인 Update 방식 | 2. Corutine을 이용한 방식 | 3. Update Manager를 이용한 방식 |
3.4ms | 0.14ms | 0.01ms |
딱 봐도 Update를 이용한 방식이 정말 많이 드는 것을 알 수 있습니다. 약 20배 정도 입니다.
결론
앞으로 개발을 하는데 있어 Update함수보다 코루틴 함수를 사용하는것이 더욱 효율적이게 될거 같네요
한 번 여러분들도 직접 실험해 보시면 재미있을겁니다.
1만개를 처리하는데 3.4ms 정도이지만 1만개가 아닌 1억개라고 생각했을땐 무시 못하게 될것이고, 이 조금의 시간이 모여서 성능의 문제가 생길 수 있게 됩니다.
'Unity > Performance' 카테고리의 다른 글
C# Generic Enum Type을 효율적으로 Int로 변환시켜보자 (0) | 2022.10.05 |
---|---|
Unity Dictionary ContainsKey 와 TryGetValue 비교 (0) | 2021.07.01 |
Unity GetComponent 위치에 따른 비용 비교 (0) | 2021.07.01 |
Unity 자식 클래스 참조 성능 비교 (0) | 2021.06.29 |
Unity 반복문 성능 비교 (0) | 2021.06.25 |