PART 7 · 강의 3/3
Physics 프로파일링
stat 명령, Unreal Insights, Debug Draw로 물리 성능 분석하기
01
콘솔 명령으로 빠른 진단
stat 명령과 물리 디버그 시각화
| 콘솔 명령 | 표시 정보 | 용도 |
|---|---|---|
stat Physics | 물리 시뮬레이션 시간, 파티클 수 | 전반적 물리 성능 확인 |
stat Chaos | Chaos 솔버 세부 시간 | 솔버 병목 분석 |
stat Collision | 충돌 감지 통계 | Broadphase/Narrowphase 비용 |
p.Chaos.DebugDraw.Enabled 1 | 물리 형상 시각화 | 콜리전 형상 확인 |
ShowFlag.Collision 1 | 콜리전 와이어프레임 | 콜리전 형상 시각화 |
p.Chaos.Solver.Joint.DebugDrawSettings 1 | 조인트 디버그 | Constraint 상태 확인 |
p.Chaos.DebugDraw.ShowContactGraph 1 | 접촉 그래프 | 충돌 네트워크 시각화 |
C++ - 물리 디버그 시각화
// C++에서 물리 디버그 정보 출력
void APhysDebugActor::DrawPhysicsDebug()
{
UWorld* World = GetWorld();
// 콜리전 형상 디버그 드로우
FBodyInstance* Body = MeshComp->GetBodyInstance();
if (Body)
{
// 속도 벡터 시각화
FVector Velocity = Body->GetUnrealWorldVelocity();
DrawDebugDirectionalArrow(
World,
GetActorLocation(),
GetActorLocation() + Velocity,
20.0f,
FColor::Red,
false, -1.0f, 0, 2.0f
);
// 무게중심 시각화
FVector COM = Body->GetCOMPosition();
DrawDebugSphere(World, COM, 10.0f, 8, FColor::Yellow);
// 슬립 상태 표시
bool bSleeping = Body->IsInstanceAwake() == false;
FColor StateColor = bSleeping ? FColor::Blue : FColor::Green;
DrawDebugBox(World, GetActorLocation(),
FVector(5), StateColor, false, -1.0f);
}
}
02
Unreal Insights로 심층 분석
프레임 단위 물리 성능 프로파일링
Unreal Insights는 엔진의 모든 서브시스템을 프레임 단위로 분석할 수 있는 강력한 프로파일링 도구입니다. 물리 스레드의 시간 분포를 정확히 확인할 수 있습니다.
Insights 사용 방법
- 1단계 — 에디터에서
-trace=cpu,frame,bookmark옵션으로 실행하거나, 콘솔에서Trace.Start입력. - 2단계 — 문제가 되는 씬을 재현하고
Trace.Stop으로 캡처 종료. - 3단계 — UnrealInsights 앱(Binaries/Win64/UnrealInsights.exe)으로 .utrace 파일을 열기.
- 4단계 — Timing 뷰에서 "Physics" 관련 스레드와 이벤트를 확인.
| Insights 타이머 | 측정 대상 | 병목 시 대응 |
|---|---|---|
FPhysScene_Chaos::Tick | 전체 물리 틱 | 전반적 물리 비용 확인 |
Broadphase | 충돌 후보 검색 | 오브젝트 수 줄이기 |
NarrowPhase | 정밀 충돌 감지 | Simple Collision 사용 |
ConstraintSolver | 제약 풀이 | Solver Iteration 줄이기 |
GenerateContacts | 접촉점 생성 | 접촉 오브젝트 수 최소화 |
UpdateResults | 결과 동기화 | 활성 바디 수 줄이기 |
03
물리 성능 최적화 체크리스트
프로덕션 물리 성능을 위한 핵심 사항
최적화 체크리스트
- 활성 바디 수 제한 — 동시에 시뮬레이션 중인 바디를 200~300개 이하로 유지합니다.
- Sleep 활용 — 정지된 오브젝트가 빠르게 Sleep에 들어가도록 Sleep Threshold를 조정합니다.
- Simple Collision 사용 — Per-Poly collision은 Trace에만 사용합니다.
- 불필요한 Overlap 비활성화 — GenerateOverlapEvents를 필요한 곳에만 true로 설정합니다.
- Destruction 파편 관리 — 파편 수명을 제한하고, 동시 활성 파편 수를 1000개 이하로 유지합니다.
- Cloth 파티클 최적화 — 파티클 수를 500개 이하로, Self-Collision은 선택적으로 사용합니다.
- Solver Iteration 최적화 — 필요한 최소한의 반복 횟수를 사용합니다.
- CCD 선택적 적용 — 고속 물체에만 CCD를 활성화합니다.
| 플랫폼 | 물리 예산 (ms) | 권장 활성 바디 | Solver Iteration |
|---|---|---|---|
| PC (하이엔드) | 2~3ms | 300+ | 8~16 |
| 콘솔 (PS5/Xbox) | 2ms | 200~300 | 8~12 |
| 모바일 | 1~1.5ms | 50~100 | 4~8 |
04
일반적인 물리 문제 해결
자주 발생하는 물리 문제와 해결 방법
| 문제 | 증상 | 원인 | 해결 |
|---|---|---|---|
| Jitter | 물체가 떨림 | 질량 비율 불균형 | 인접 물체 질량 비율 10:1 이내로 |
| Tunneling | 물체가 관통 | 고속 이동, 얇은 벽 | CCD 활성화, 벽 두께 증가 |
| Explosion | 물체가 갑자기 튕겨나감 | 초기 관통 상태 | 스폰 위치 확인, 충돌 마진 |
| Floating | 물체가 공중에 떠있음 | Sleep 후 지지물 제거 | WakeInstance() 호출 |
| Stacking 불안정 | 쌓인 물체가 무너짐 | Solver Iteration 부족 | 반복 횟수 증가 (16+) |
| 성능 저하 | 프레임 드롭 | 활성 바디 과다 | Sleep, 파편 제거, LOD 적용 |
질량 비율 규칙
접촉하는 두 물체의 질량 비율이 10:1을 초과하면 솔버가 불안정해질 수 있습니다(Jitter, 관통). 거대한 건물 위에 작은 물체를 올릴 때, 건물의 질량을 무한대로 설정하기보다 적절한 범위 내로 제한하세요.
SUMMARY
핵심 요약
stat Physics,stat Chaos콘솔 명령으로 물리 성능을 빠르게 진단합니다.- Unreal Insights로 Broadphase, Narrowphase, ConstraintSolver 등 세부 비용을 프레임 단위로 분석합니다.
- 플랫폼별 물리 예산: PC 2~3ms, 콘솔 2ms, 모바일 1~1.5ms 이내를 목표로 합니다.
- Jitter, Tunneling, Explosion 등 일반적 문제는 질량 비율, CCD, 스폰 위치를 확인하여 해결합니다.
- 프로덕션에서는 활성 바디 수 200~300개, Sleep 최적화, 파편 수명 관리가 핵심입니다.
PRACTICE
도전 과제
배운 내용을 직접 실습해보세요
실습 1: Physics 디버그 시각화
p.Chaos.DebugDraw.Enabled 1, show Collision 등 디버그 명령어로 물리 콜리전, 접촉점, Constraint를 시각화하세요. 각 시각화 모드의 의미를 이해하고 문제를 진단하세요.
실습 2: Unreal Insights 물리 프로파일링
Unreal Insights를 실행하고 Physics 채널의 Timing 데이터를 분석하세요. Broadphase, Narrowphase, Solver 각 단계의 시간 비율을 파악하고 성능 병목을 식별하세요.
심화 과제: 자동화된 물리 성능 벤치마크
C++로 물리 객체 수를 점진적으로 증가시키며 FPS, Physics Thread 시간, 메모리 사용량을 CSV로 기록하는 자동화 벤치마크 시스템을 구축하세요.