프로파일링 도구
Unreal Insights, Stat 명령어, GPU Profiler로 병목 지점을 정확히 파악하기
프로파일링이 중요한 이유
추측하지 말고 측정하라
"추측으로 최적화하지 마라." 프로파일링 없이 최적화하면 시간 낭비가 될 수 있습니다. 실제 병목 지점을 데이터로 확인한 후 최적화해야 효과적입니다.
최적화 프로세스
프로파일링 도구로 현재 성능 상태를 측정합니다.
데이터를 분석하여 가장 큰 병목 지점을 찾습니다.
병목 지점에 집중하여 최적화합니다.
다시 측정하여 개선 효과를 확인합니다.
Unreal Insights
가장 강력한 프로파일링 도구
Unreal Insights는 UE5의 통합 프로파일링 도구로, 트레이스 기반의 상세한 성능 데이터를 제공합니다.
트레이싱 시작 방법
// 에디터에서 트레이싱 시작
Window > Developer Tools > Session Frontend > Unreal Insights
// 또는 콘솔 명령으로 시작/종료
trace.start
trace.stop
// 커맨드라인으로 상세 트레이싱
-trace=log,counters,cpu,frame,bookmark,file,loadtime,gpu,rhicommands,rendercommands,object
-statnamedevents
주요 분석 채널
| 채널 | 분석 내용 | 사용 시나리오 |
|---|---|---|
| cpu | 게임 스레드, 틱 함수, 물리 | 프레임 드랍 원인 분석 |
| gpu | 렌더 패스, 셰이더 비용 | GPU 바운드 상황 분석 |
| memory | 할당, 해제, 누수 | 메모리 최적화 |
| loadtime | 에셋 로딩 시간 | 로딩 최적화 |
| frame | 프레임 타이밍 | 프레임 히치 분석 |
C++에서 커스텀 이벤트 추가
#include "ProfilingDebugging/CpuProfilerTrace.h"
void AMyActor::ExpensiveFunction()
{
// Insights 타임라인에 이벤트로 표시됨
TRACE_CPUPROFILER_EVENT_SCOPE(MyActor_ExpensiveFunction);
// 실제 작업 수행
PerformHeavyCalculation();
}
// 북마크 추가 (특정 시점 표시)
TRACE_BOOKMARK(TEXT("Level Loaded"));
// 카운터 추적
TRACE_COUNTER_SET(TEXT("EnemyCount"), EnemyCount);
TRACE_COUNTER_ADD(TEXT("TotalDamage"), DamageAmount);
Stat 명령어
실시간 성능 모니터링
기본 성능 확인
// 기본 성능
stat fps // FPS 표시
stat unit // CPU/GPU 프레임 시간
stat unitgraph // 프레임 시간 그래프
// 렌더링
stat scenerendering // 씬 렌더링 통계 (드로우 콜 포함)
stat gpu // GPU 패스별 시간
stat rhi // RHI 통계
stat streaming // 텍스처 스트리밍
// 게임플레이
stat game // 게임 스레드 통계
stat physics // 물리 시뮬레이션
stat collision // 충돌 검사
stat ai // AI 시스템
// 메모리
stat memory // 전체 메모리 사용량
stat memoryplatform // 플랫폼별 메모리
stat levels // 레벨별 메모리
// 틱 분석
dumpticks // 틱킹 객체 목록
dumpticks grouped // 그룹별 정렬
C++ 커스텀 Stat 정의
// Stat 그룹 정의
DECLARE_STATS_GROUP(TEXT("MyGame"), STATGROUP_MyGame, STATCAT_Advanced);
// 개별 Stat 정의
DECLARE_CYCLE_STAT(TEXT("Expensive Function"), STAT_ExpensiveFunction, STATGROUP_MyGame);
DECLARE_CYCLE_STAT(TEXT("AI Update"), STAT_AIUpdate, STATGROUP_MyGame);
void AMyActor::ExpensiveFunction()
{
// RAII 스타일 - 스코프 종료 시 자동 측정 완료
SCOPE_CYCLE_COUNTER(STAT_ExpensiveFunction);
// 측정할 코드
PerformHeavyCalculation();
}
void AAIController::UpdateAI()
{
SCOPE_CYCLE_COUNTER(STAT_AIUpdate);
// AI 로직
ProcessBehaviorTree();
}
stat MyGame 명령으로 커스텀 그룹의 통계를 확인할 수 있습니다. 병목 지점이 의심되는 함수에 SCOPE_CYCLE_COUNTER를 추가하여 정확한 비용을 측정하세요.
GPU Profiler
렌더링 병목 분석
// GPU 프로파일러 실행
ProfileGPU // 콘솔 명령
Ctrl + , // 에디터 단축키
주요 렌더 패스
- PrePass / DepthPass - 깊이 버퍼 렌더링
- BasePass - 지오메트리 및 머티리얼 렌더링 (가장 비용이 큼)
- ShadowDepths - 그림자 맵 렌더링 (VSM 포함)
- Lighting - 조명 계산 (Lumen GI/반사 포함)
- Translucency - 반투명 오브젝트 렌더링
- PostProcessing - 후처리 효과 (TSR, DoF, Bloom 등)
시각화 모드
// 뷰모드 전환
viewmode wireframe // 와이어프레임
viewmode lit // 기본 lit
viewmode unlit // 언릿
viewmode lightcomplexity // 라이트 복잡도
viewmode shadercomplexity // 셰이더 복잡도 (빨간색 = 비쌈)
viewmode quadoverdraw // 쿼드 오버드로우
// LOD 시각화
viewmode levelcoloration // 레벨 컬러링
viewmode lodcoloration // LOD 컬러링
// Nanite 시각화
r.Nanite.Visualize.MaterialComplexity 1
r.Nanite.Visualize.RasterMode 1
// VSM 시각화
r.Shadow.Virtual.Visualize cache
r.Shadow.Virtual.Visualize naniteoverdraw
Visual Logger
시각적 디버깅 도구
#include "VisualLogger/VisualLogger.h"
void AMyAI::UpdateAI()
{
// 텍스트 로그
UE_VLOG(this, LogAI, Log, TEXT("AI State: %s"), *GetStateName());
// 위치 표시 (구체)
UE_VLOG_LOCATION(this, LogAI, Log,
GetActorLocation(), 50.f, FColor::Green,
TEXT("AI Position"));
// 선분 그리기
UE_VLOG_SEGMENT(this, LogAI, Log,
StartPoint, EndPoint, FColor::Blue,
TEXT("Path"));
// 박스 그리기
UE_VLOG_BOX(this, LogAI, Log,
BoundingBox, FColor::Yellow,
TEXT("Detection Area"));
}
// 에디터에서: Window > Developer Tools > Visual Logger
Visual Logger는 AI 디버깅에 특히 유용합니다. 시간대별로 AI의 상태 변화, 이동 경로, 감지 영역 등을 시각적으로 확인할 수 있습니다.
핵심 요약
- Unreal Insights - 가장 강력한 종합 프로파일링 도구, 트레이스 기반 상세 분석
- stat 명령어 - 실시간 성능 모니터링, 카테고리별 빠른 확인
- GPU Profiler - 렌더 패스별 GPU 시간 분석, Ctrl+, 단축키
- SCOPE_CYCLE_COUNTER - 커스텀 함수 비용 측정
- Visual Logger - AI 및 게임플레이 이벤트 시각적 디버깅
- 시각화 모드 - shadercomplexity, quadoverdraw로 렌더링 비용 확인
프로파일링은 Test 또는 Development 빌드에서 수행해야 합니다. Debug 빌드는 최적화가 비활성화되어 실제 성능과 다를 수 있습니다.
도전 과제
배운 내용을 직접 실습해보세요
RPG 오픈월드 씬에서 stat fps, stat unit, stat unitgraph를 실행하여 CPU/GPU/Game Thread/Render Thread 시간을 분석하세요. 병목 지점이 CPU인지 GPU인지 판별하세요.
trace.start cpu,gpu,frame 명령으로 트레이스를 시작하고, Unreal Insights에서 프레임 타임라인을 분석하세요. 가장 비용이 높은 함수와 렌더링 패스를 식별하세요.
프로파일링 체크리스트를 만들고(stat GPU, stat SceneRendering, stat Nanite, stat Lumen, stat Memory), 빌드 전후 성능 비교 리포트를 자동 생성하는 워크플로우를 수립하세요.