icon안동민 개발노트

파티클 효과의 기본 최적화 기법


 나이아가라 파티클 시스템의 효과적인 최적화는 게임의 전반적인 성능 향상에 중요한 역할을 합니다.

 이 절에서는 파티클 효과를 최적화하는 다양한 기법과 전략을 살펴보겠습니다.

파티클 수 관리

 파티클 수는 성능에 직접적인 영향을 미치는 가장 중요한 요소입니다.

 스폰 레이트 최적화

[Spawn] 모듈
Rate: Math.Min(DesiredRate, MaxAllowedRate)

 파티클 수명 관리

[Initialize Particle] 모듈
Lifetime: Math.Min(DesiredLifetime, MaxAllowedLifetime)

 최대 파티클 수 제한

[Emitter Properties]
Max Particle Count: 적절한 값 설정 (예: 1000)

LOD (Level of Detail) 시스템 구현

 거리에 따라 파티클 시스템의 복잡도를 조절합니다.

[System Update] 모듈
LOD Distance: 1000
LOD Method: Particle Count Scale
[LOD Settings]
LOD 0 (0-500 units): 100% particles
LOD 1 (500-1000 units): 50% particles
LOD 2 (1000+ units): 25% particles

효율적인 텍스처 및 머티리얼 사용

 텍스처 아틀라스 활용

  • 여러 개의 작은 텍스처를 하나의 큰 텍스처로 합쳐 draw call을 줄입니다.
[Sprite Renderer] 모듈
Texture: ParticleAtlasTexture
Sub UV: True

 머티리얼 인스턴싱

  • 동일한 머티리얼을 사용하는 여러 파티클 시스템에 머티리얼 인스턴스를 활용합니다.
[Renderer Properties]
Material: ParticleMaterialInstance

컴퓨트 셰이더 활용

 복잡한 파티클 동작을 GPU에서 처리하여 CPU 부하를 줄입니다.

[GPU Compute] 모듈
Simulation Stage: Particle Update
Compute Shader: CustomParticleUpdateCS

파티클 시스템 프로파일링

 언리얼 인사이트 활용

  1. 언리얼 에디터에서 Window > Developer Tools > Session Frontend 열기
  2. Profiler 탭에서 Niagara 관련 통계 확인

 GPU 시각화 도구 사용

r.Niagara.ProfileGPU 1

 이 콘솔 명령어로 GPU 프로파일링 정보를 화면에 표시할 수 있습니다.

성능 병목 지점 식별 및 해결

  1. CPU 병목: 파티클 시스템 및 이미터 수 줄이기
  2. GPU 병목: 파티클 수 및 복잡한 셰이더 최적화
  3. 메모리 병목: 텍스처 해상도 낮추기, 불필요한 모듈 제거

다양한 하드웨어 환경 고려

 스케일러블 품질 설정

[System Update] 모듈
Quality Scale: Engine.Scalability.ParticleQualityScale

 모바일 최적화

[Material]
Fully Rough: True
Disable Depth Test: True (투명한 파티클의 경우)

GPU와 CPU 성능 밸런싱

 GPU 시뮬레이션 활용

[Emitter Properties]
Simulation Target: GPUCompute

 CPU 시뮬레이션 필요 시

  • 복잡한 게임 로직과 연동되는 파티클의 경우 CPU 시뮬레이션을 사용합니다.

메모리 사용 최적화

 공유 데이터 활용

[Data Interface] 모듈
Interface Class: NiagaraDataInterfaceSharedParameterCollection

 동적 리소스 로딩

  • 필요한 시점에 텍스처와 머티리얼을 동적으로 로드하고 언로드합니다.

대규모 오픈 월드 최적화

 거리 기반 컬링

[Emitter Update] 모듈
Condition: Distance To Camera < MaxVisibleDistance

 섹터 기반 활성화

  • 월드를 섹터로 나누고, 플레이어가 있는 섹터와 인접 섹터의 파티클 시스템만 활성화합니다.

시각적 품질과 성능 균형

 중요도 기반 최적화

  • 주요 게임플레이 요소와 관련된 파티클에 더 많은 리소스를 할당합니다.

 LOD 설정 미세 조정

[LOD Settings]
LOD 0: Full quality (100% particles, complex shaders)
LOD 1: High quality (75% particles, simplified shaders)
LOD 2: Medium quality (50% particles, basic shaders)
LOD 3: Low quality (25% particles, minimal effects)

일반적인 최적화 실수 피하기

  1. 과도한 오버드로 : 화면 밖 파티클 시스템 비활성화
  2. 불필요한 정밀도 : 간단한 연산에 double 대신 float 사용
  3. 무분별한 콜리전 : 필요한 경우에만 콜리전 체크 수행
  4. 과도한 모듈 사용 : 필요한 모듈만 활성화

적용 예시 : 폭발 효과 최적화

 최적화 전

[Emitter Properties]
Simulation Target: CPUCompute
Max Particle Count: 10000
 
[Spawn] 모듈
Rate: 5000
 
[Initialize Particle] 모듈
Lifetime: 5.0
 
[Sprite Renderer] 모듈
Material: ComplexExplosionMaterial
Sub UV: False
 
[Collision] 모듈
Collision Mode: Scene Depth Collision

 최적화 후

[Emitter Properties]
Simulation Target: GPUCompute
Max Particle Count: 2000
 
[Spawn] 모듈
Rate: Math.Min(DesiredRate, 1000)
 
[Initialize Particle] 모듈
Lifetime: Math.Min(DesiredLifetime, 2.0)
 
[Sprite Renderer] 모듈
Material: OptimizedExplosionMaterialInstance
Sub UV: True
 
[GPU Compute] 모듈
Simulation Stage: Particle Update
Compute Shader: SimpleExplosionCS
 
[System Update] 모듈
LOD Distance: 500
LOD Method: Particle Count Scale
[LOD Settings]
LOD 0 (0-250 units): 100% particles
LOD 1 (250-500 units): 50% particles
LOD 2 (500+ units): 25% particles
 
[Emitter Update] 모듈
Condition: Distance To Camera < 1000

 이 최적화된 버전은 GPU 컴퓨팅을 활용하고 파티클 수를 제한하며 LOD 시스템을 구현하고, 거리 기반 컬링을 적용하여 성능을 크게 향상시킵니다.

 파티클 시스템 최적화는 지속적인 프로파일링과 반복적인 조정이 필요한 과정입니다.

 게임의 요구사항과 타겟 하드웨어의 제약을 항상 고려하면서 시각적 품질과 성능 사이의 최적의 균형점을 찾아야 합니다.

 다양한 최적화 기법을 조합하고 실험하여 게임에 가장 적합한 최적화 전략을 개발하세요.