GPU Sim 기초
GPU Compute Shader 기반 시뮬레이션으로 수백만 파티클을 실시간 처리하는 방법을 학습합니다.
CPU vs GPU 시뮬레이션
각 모드의 특성과 제약 사항
| 특성 | CPU Sim | GPU Compute Sim |
|---|---|---|
| 최대 파티클 수 | 수천 개 | 수백만 개 |
| 이벤트 핸들러 | 지원 | 미지원 |
| Simulation Stage | 미지원 | 지원 |
| Data Interface 호환성 | 전체 지원 | 일부 제한 |
| Component Renderer | 지원 | 미지원 |
| CPU 부하 | 높음 | 매우 낮음 |
| GPU 부하 | 렌더링만 | 시뮬레이션 + 렌더링 |
| Data Channel | 지원 | 지원 |
// Emitter Properties에서 Sim Target 변경
Emitter Properties
{
Sim Target: GPUComputeSim // CPU Sim에서 변경
// GPU Sim 전환 시 자동 경고:
// - Event Handler 모듈은 비활성화됨
// - 일부 Data Interface가 호환되지 않을 수 있음
// - Component Renderer 사용 불가
Fixed Bounds: (Min: -500, Max: 500)
// GPU Sim에서는 Fixed Bounds 사용 권장 (Dynamic Bounds 비용 높음)
}
파티클 수가 수만 개 이상이거나, Simulation Stage(Neighbor Grid, 유체 시뮬레이션 등)가 필요하면 GPU Sim을 선택하세요. 이벤트나 Component Renderer가 필요하면 CPU Sim을 유지하되, Data Channel로 대체를 고려하세요.
Simulation Stage
GPU Sim 전용 다단계 시뮬레이션
Simulation Stage는 GPU Sim에서만 사용 가능한 기능으로, 매 프레임 파티클 시뮬레이션을 여러 단계(Stage)로 나누어 실행할 수 있습니다. 이를 통해 파티클 간 상호작용, 그리드 기반 시뮬레이션 등 고급 동작을 구현합니다.
// Emitter의 스택에 Simulation Stage 그룹 추가
+ 버튼 → Simulation Stage
Simulation Stage
{
Iteration Source: Particles
// Particles: 각 파티클에 대해 1회 실행
// Data Interface: Grid 등의 DI 셀에 대해 실행
Num Iterations: 1
// 이 스테이지를 몇 번 반복할 것인가
Execute Behavior: Always
// Always: 매 프레임
// On Simulation Reset: 리셋 시에만
// Not on Simulation Reset: 리셋 제외
}
Iteration Source 종류
| Iteration Source | 반복 대상 | 사용 사례 |
|---|---|---|
Particles |
각 파티클 | 파티클 간 인터랙션, 후처리 |
Data Interface |
Grid 셀, 버퍼 요소 | Neighbor Grid, Render Target에 쓰기 |
Simulation Stage는 Particle Spawn과 Particle Update 사이에 실행됩니다. 여러 Stage를 추가하면 위에서 아래로 순차 실행됩니다. 전형적인 패턴: 1단계 - 파티클을 Grid에 등록, 2단계 - Grid에서 이웃 검색하여 힘 계산, 3단계 - 결과 반영.
GPU Sim 최적화
Fixed Bounds, 메모리, Dispatch 최적화
Fixed Bounds 설정
GPU Sim에서 Dynamic Bounds 계산은 GPU에서 CPU로 데이터를 읽어오는(Readback) 비용이 발생합니다. Fixed Bounds를 설정하면 이 비용을 제거할 수 있습니다.
Emitter Properties
{
Calculate Bounds Mode: Fixed
Fixed Bounds:
Min: (-1000, -1000, -1000)
Max: (1000, 1000, 1000)
}
// 또는 System 레벨에서 전체 Emitter에 적용
System Properties
{
Fixed Bounds: (Min: -2000, Max: 2000)
}
// 주의: 바운드 밖의 파티클은 컬링되어 보이지 않음
// 파티클이 이동할 수 있는 최대 범위보다 크게 설정
GPU 메모리 관리
| 설정 | 영향 | 권장 |
|---|---|---|
| Max Allocation Count | GPU 파티클 버퍼의 최대 크기 | 필요한 최대 파티클 수의 1.2~1.5배 |
| Attribute 최소화 | 각 파티클의 메모리 사용량 | 불필요한 커스텀 Attribute 제거 |
| Precision | float 정밀도 (32 vs 16) | 정밀도가 불필요한 값은 half precision 고려 |
GPU에서 CPU로 데이터를 읽어오는 작업(Readback)은 성능 병목의 주요 원인입니다. Dynamic Bounds, Execution State 변경, 파티클 수 쿼리 등이 Readback을 유발합니다. 가능하면 Fixed Bounds를 사용하고, 파티클 수에 의존하는 로직을 피하세요.
GPU Sim 실전 예제
대규모 파티클 이펙트 구현
NS_StarField
Emitter Properties:
Sim Target: GPUComputeSim
Calculate Bounds Mode: Fixed
Fixed Bounds: (-5000, -5000, -5000) ~ (5000, 5000, 5000)
Local Space: true
Emitter Update:
Spawn Burst Instantaneous
SpawnCount = 1000000
Particle Spawn:
Initialize Particle
Lifetime: Float Max // 영원히 살아있음
SpriteSize: Uniform Ranged Float (0.5, 3.0)
Color: Uniform Ranged Color
Min: (0.7, 0.7, 1.0, 0.5)
Max: (1.0, 1.0, 1.0, 1.0)
Sphere Location
Radius: 5000.0
Surface Only: false
Particle Update:
Particle State
Kill When Lifetime Elapsed: false
// 별이 반짝이는 효과 - HLSL Expression
Scale Color
Alpha: Expression
0.5 + 0.5 * sin(Particles.UniqueID * 0.01 + Engine.Time * 2.0)
Render:
Sprite Renderer
Material: M_StarParticle // Additive 블렌딩
Sort Mode: None // 정렬 불필요 (성능 절약)
핵심 요약
- GPU Sim은 Compute Shader 기반으로 수백만 파티클을 처리하지만, 이벤트와 Component Renderer를 지원하지 않습니다.
- Simulation Stage는 GPU Sim 전용 기능으로, 다단계 시뮬레이션(Grid 연산, 파티클 간 인터랙션)을 가능하게 합니다.
- Fixed Bounds를 설정하여 GPU Readback 비용을 제거하는 것이 GPU Sim 최적화의 핵심입니다.
- 파티클 수가 수만 개 이상이거나 Simulation Stage가 필요하면 GPU Sim을, 이벤트가 필요하면 CPU Sim을 선택하세요.
- GPU 메모리는 Max Allocation Count와 Attribute 수를 최소화하여 관리합니다.
- Data Channel은 GPU Sim에서도 사용 가능하여, 이벤트의 대안이 됩니다.
도전 과제
배운 내용을 직접 실습해보세요
기존 CPU 이미터의 Sim Target을 GPUCompute Sim으로 변경하세요. Spawn Count를 100,000+로 높이고, CPU 모드와 GPU 모드의 프레임 레이트 차이를 stat unit 명령으로 비교하세요.
GPU Sim에서만 사용 가능한 Simulation Stage를 추가하세요. 각 Stage에서 Iteration Source를 DataInterface 또는 Particles로 설정하고, 멀티 스테이지 시뮬레이션의 기본 구조를 파악하세요.
GPU Sim에서 지원되지 않는 기능(예: 특정 Data Interface, CPU 전용 모듈)을 파악하고, 동일한 이펙트를 CPU/GPU 각각으로 구현하여 기능 차이와 성능 트레이드오프를 문서화하세요.