해당 포스팅은 Stuart Butler , Tom Oliver의 Game Development Patterns with Unreal Engine 5를 바탕으로 작성한 내용입니다.
얼마만큼의 개선이 이루어졌을까?
[[Unreal Engine] Tick 함수 최적화](https://velog.io/@imeamangryang/Unreal-Engine-Tick-%ED%95%A8%EC%88%98-%EC%B5%9C%EC%A0%81%ED%99%94-1)에서 감시 타워의 Tick 코드를 다음과 같이 최적화해보았다.
| 항목 | 수정 전 | 수정 후 |
|---|---|---|
| 적 감지 | 매 Tick 스피어 트레이스 | SphereComponent Overlap 이벤트 + LineTrace |
| 라이트 회전 | Tick에서 AddLocalRotation, 하드코딩 | Timeline + CurveFloat로 프레임 독립적 회전 |
| Gated Polling | 미적용, 항상 검사 | 적 발견 여부에 따라 회전/트레이스 제어 |
| 성능 | 매 프레임 불필요 연산 | 이벤트 발생 시에만 최소 연산 |
| 가독성 | Tick에 모든 로직 포함 | 함수 분리, 역할 별 모듈화 |
그렇다면 과연 정량적인 수치적으로 얼마만큼의 개선이 이루어 냈는 지 알아보도록 하자.
Unreal Insight 사용하기
우선 성능 측정을 위해 수정 전 버전과 후 버전의 감시 타워를 배치하자.
에디터를 활성화하여 게임플 플레이한 후 아래의 언리얼 인사이트의 프로파일링을 위한 트레이스 시작 버튼을 누르자.
그 전에 프로파일링한 데이터를 바로 볼 수 있도록 아래의 옵션을 체크해주면 편리하다.
어느정도 성능 측정이 된 것 같다면 다시 트레이스 버튼을 눌러 종료하면 에디터 내에서 일어난 다양한 기록을 볼 수 있다.
많이 복잡해 보이지만
- 위쪽 화면은 각 프레임당 얼마만큼의 시간이 걸렸는 지 확인
- 아래 화면은 프레임 내 어떤 테스트들이 어떤 순서로 발생했는 지 확인
이 가능하다.
우리가 구현한 감시 타워의 테스크는 Game Thread에서 찾을 수 있다.
이 중에서도 UWorld_Tick Task를 확대해보면 하위에 위치한 모든 오브젝트들이 바로 우리가 보고 있는 월드에서 벌어지고 있는 작업들이다.
Performance Profiling
최적화 전 성능
최적화 이전의 감시 타워는
- Inclusive Time : 95.6 µs
- Exclusive Time : 47.8 µs
의 시간이 소요됐다.
Inclusive Time과 Exclusive Time
Inclusive Time은 해당 함수나 이벤트가 실행되는 전체 시간을 의미한다. (자신과 자식들의 총 비용) Exclusive Time은 해당 함수가 직접 소비한 시간만 의미한다. (순수하게 이 함수 내부에서만 사용된 시간)
최적화 후 성능
최적화 이후의 감시 타워는
- Inclusive Time : 1.1 µs
- Exclusive Time : 1.1 µs
의 시간이 소요됐으며,
타임라인으로 바꾼 Task는
- Inclusive Time : 36.8 µs
- Exclusive Time : 200 ns
가 걸렸다.
비교
| 구분 | 최적화 전 | 최적화 후 (Tick + Timeline) | 개선 비율 |
|---|---|---|---|
| 감시 타워 | 95.6 µs | 1.1 µs + 36.8 µs = 37.9 µs | 약 2.5배 감소 |
최적화 후에도 Timeline Task 때문에 일부 비용이 발생하지만, 전체 Inclusive Time은 95.6 µs → 37.9 µs로 약 2.5배 감소한 것을 볼 수 있다.
⚠️주의
해당 분석은 단순 시뮬레이션을 통한 수치이며, 실제로는 타임라인을 이용한 방식도 Tick 만큼이나 시간을 소요할 수 있다. 어디까지나 유연하게 수치를 보며 다양한 방법을 통해 최적화를 이루어 내는 것이 좋다.