성능 최적화
GPU Processing, 프로파일링, 인스턴싱 전략, 메모리 관리 등 PCG 성능 최적화 기법을 마스터합니다.
PCG 성능 병목 분석
프로파일링 도구와 성능 병목 식별
성능 병목 유형
| 병목 유형 | 증상 | 원인 | 진단 도구 |
|---|---|---|---|
| 생성 시간 | Generate 시 긴 대기 | 복잡한 그래프, 많은 포인트 | stat PCG, 노드별 실행 시간 |
| 렌더링 | 낮은 FPS | 과다 드로우콜, 높은 폴리곤 | stat RHI, GPU Profiler |
| 메모리 | 메모리 초과, 크래시 | 너무 많은 인스턴스, 미정리 | stat Memory, Memreport |
| 스트리밍 | 팝인, 지연 로드 | 파티션 크기 부적절 | WP 디버그 뷰 |
// 콘솔 명령어로 PCG 성능 진단
stat PCG // PCG 프레임워크 통계
// → Generation Time, Point Count, Active Cells
stat RHI // 렌더링 하드웨어 통계
// → Draw Calls, Triangles Rendered
stat Memory // 메모리 사용량
stat SceneRendering // 씬 렌더링 통계
pcg.Debug.DrawCells 1 // 파티션 셀 시각화
pcg.Debug.DrawBounds 1 // 포인트 바운드 시각화
// Unreal Insights로 상세 프로파일링:
// Run with -trace=cpu,frame,counters
// → PCG 노드별 실행 시간 분석
GPU Processing
GPU 가속으로 대량 포인트 처리 성능 향상
PCG GPU Processing 플러그인은 포인트 처리 연산을 GPU에서 실행하여 수백만 개의 포인트를 빠르게 처리합니다. UE 5.5+에서 사용 가능합니다.
| 처리 방식 | 포인트 100만 개 | 적합한 상황 |
|---|---|---|
| CPU (기본) | ~2-5초 | 소규모 (10만 이하), 복잡한 로직 |
| GPU Processing | ~0.1-0.3초 | 대규모 (10만 이상), 수학 연산 중심 |
모든 노드가 GPU 처리를 지원하는 것은 아닙니다. 현재 수학 연산, 필터링, 노이즈 등 데이터 병렬 처리에 적합한 노드에서 GPU 가속이 가능합니다. Actor Spawning이나 복잡한 참조 처리는 여전히 CPU에서 수행됩니다.
인스턴싱과 드로우콜 최적화
HISMC, Nanite, ISM으로 렌더링 성능 극대화
인스턴싱 전략
| 인스턴싱 방식 | 드로우콜 | 적합한 상황 |
|---|---|---|
HISMC (기본) |
메시당 1 드로우콜 | 일반적인 PCG 배치. LOD, 컬링 자동 지원 |
ISMC |
메시당 1 드로우콜 | 계층적 컬링이 불필요한 경우 |
Nanite 메시 |
극도로 효율적 | 고폴리곤 메시, Nanite 지원 에셋 |
개별 Actor |
인스턴스당 1+ 드로우콜 | 물리/AI 상호작용이 필요한 오브젝트 |
// PCG 드로우콜 최적화 가이드
[전략 1: 메시 병합]
→ 같은 머티리얼의 메시를 Static Mesh Spawner 하나로 통합
→ Weight로 변형 관리
→ 결과: 1 드로우콜로 수천 인스턴스 렌더링
[전략 2: Nanite 활용]
→ Nanite 지원 메시 사용
→ 자동 LOD + 극도로 효율적 렌더링
→ 수백만 폴리곤도 실시간 렌더링 가능
[전략 3: LOD 관리]
→ 원거리 메시: 저폴리곤 LOD 또는 Impostor
→ HLOD 빌드로 원거리 자동 병합
→ Hierarchical Generation으로 거리별 디테일 분리
[전략 4: Spawner 설정]
Static Mesh Spawner:
Instance Packing Mode: PackedISMC // 인스턴싱 최적화
Cull Distance: 20000 // 200m 이상 컬링
그래프 최적화 기법
PCG 그래프 자체의 실행 성능 개선
초기 필터링
그래프 초반에 강력한 필터를 배치하여 후속 노드가 처리할 포인트 수를 최소화합니다. Surface Sampler 직후에 Density Filter를 적용하세요.
불필요한 Attribute 제거
Delete Attributes로 더 이상 사용하지 않는 Attribute를 제거하여 포인트당 메모리를 절약합니다.
샘플러 밀도 최적화
필요 이상으로 높은 Points Per Sq Meter를 사용하지 마세요. 최종 배치 밀도의 2~3배 정도가 적정합니다.
캐싱 활용
자주 변경되지 않는 중간 결과를 PCG Data Asset으로 캐싱하면 반복 실행을 방지할 수 있습니다.
최적화 전/후 비교
// ❌ 최적화 전: 비효율적 패턴
[Surface Sampler] (1.0 ppsm) // 100만 포인트 생성
→ [Spatial Noise] // 100만 포인트 처리
→ [Transform Points] // 100만 포인트 변환
→ [Density Filter] (0.8~1.0) // 80만 포인트 제거
→ [Self Pruning] // 15만 포인트 제거
→ [Spawner] // 5만 인스턴스 생성
// 처리: 100만 → 20만 → 5만 (낭비 95%)
// ✅ 최적화 후: 효율적 패턴
[Surface Sampler] (0.15 ppsm) // 15만 포인트 생성
→ [Density Filter] (0.3~1.0) // 즉시 간추리기
→ [Self Pruning] // 겹침 제거
→ [Spatial Noise] // 5만 포인트만 처리
→ [Transform Points] // 5만 포인트 변환
→ [Spawner] // 5만 인스턴스 생성
// 처리: 15만 → 5만 (낭비 67% 감소)
UE 5.7에서 PCG 프레임워크의 내부 최적화로 약 2배의 성능 향상이 달성되었습니다. 동일 그래프를 UE 5.5에서 5.7로 마이그레이션하면 별도 조정 없이도 성능이 개선됩니다.
핵심 요약
- PCG 성능 병목은 생성 시간, 렌더링, 메모리, 스트리밍 네 유형으로 분류되며
stat PCG로 진단한다 - GPU Processing은 수학 연산 중심의 대규모 포인트 처리를 CPU 대비 10~20배 가속한다
- HISMC/Nanite 인스턴싱으로 수천 인스턴스를 1 드로우콜로 렌더링한다
- 그래프 초반에 강력한 필터를 배치하여 후속 처리 포인트 수를 최소화해야 한다
- Surface Sampler의 밀도는 최종 배치 밀도의 2~3배 정도가 적정하다
- UE 5.7에서 별도 최적화 없이도 약 2배 성능 향상이 달성되었다
도전 과제
배운 내용을 직접 실습해보세요
PCG 디버그 도구를 사용하여 각 노드의 실행 시간을 측정하세요. 병목 노드를 식별하고, 밀도를 줄이거나 필터를 앞 단계로 이동하여 생성 시간을 50% 이상 개선하세요.
Static Mesh Spawner의 출력을 Hierarchical Instanced Static Mesh로 전환하고, 일반 Static Mesh Actor 대비 드로우 콜과 메모리 사용량 차이를 측정하세요.
LOD별 PCG 전략(LOD0: 풀 디테일, LOD1: 주요 오브젝트만, LOD2: 빌보드)을 구현하세요. HLOD 통합, 오클루전 기반 생성 제어를 조합하여 60FPS를 유지하며 품질을 최대화하세요.