안동민 개발노트

본문 시작

파티클 시스템의 최적화 기법

파티클 수·콜리전 방식·물리 계산·오버드로·LOD를 조정하고 Niagara 프로파일러로 병목을 측정해 비용을 줄입니다.

충돌·물리·렌더링 비용은 서로 다른 원인에서 발생합니다. 먼저 같은 카메라, 품질, 하드웨어와 동시 시스템 수로 기준 장면을 정한 뒤 가장 큰 비용부터 줄입니다.

동시 입자 수와 시스템 수

Spawn Rate, Burst Count, Lifetime을 함께 조절합니다. 정상 상태의 연속 생성은 대략 생성률 × 평균 수명으로 살아 있는 수를 추정할 수 있습니다. 비용이 반드시 기하급수적으로 증가하는 것은 아니며 입자당 작업, 화면 중첩, 시스템 관리 비용에 따라 달라집니다.

Emitter의 메모리 할당 관련 수치와 살아 있는 입자 수의 강제 상한을 혼동하지 않습니다. 모든 버전에 Scalability의 Max Particles라는 공통 필드가 있는 것도 아닙니다. 실제 생성량·수명·동시 시스템 예산으로 상한을 설계하고 Niagara Effect Type과 System/Emitter Scalability에 반영합니다.

충돌과 물리 계산

줄일 대상조정 방법보존할 결과
CPU trace 수핵심 입자만 충돌, 수명·조회 범위 제한화면에서 필요한 접촉 반응
GPU 충돌Scene Depth/Distance Fields의 지원과 오차 비교카메라 밖·얇은 표면의 허용 범위
충돌 후 계산첫 충돌 후 제거 또는 실제 지원되는 정지/카운트 정책필요한 반발과 잔상
힘·노이즈중복 모듈 제거, 필요 없는 품질 단계에서 제외전체 궤적과 실루엣
랜덤 입력고정 성질은 Spawn에서 한 번 기록파티클별 차이 유지

Distance Fields가 항상 가장 정확하고 싼 것은 아닙니다. CPU trace와 GPU 표면 조회는 다른 데이터를 사용하므로 목표 장면에서 비교합니다. Restitution을 단순한 숫자로 바꾸거나 Mass를 고정한다고 연산이 자동으로 크게 줄어들지도 않습니다. 기본 Drag는 질량과 무관하며, 임의의 질량 차이를 곧바로 서로 다른 비용으로 해석하지 않습니다.

스크립트와 데이터

  • 사용하지 않는 모듈을 제거하고, Static Switch 등으로 제외된 코드가 실제로 컴파일에서 빠지는지 확인합니다. 동적 If/Select를 넣었다는 이유만으로 선택되지 않은 입력의 비싼 계산이 생략된다고 가정하지 않습니다.
  • 거리와 비음수 임계값 R을 비교할 때는 LengthSquared와 R²를 함께 사용하면 제곱근을 피할 수 있습니다. 거리 자체나 단위 방향이 필요할 때까지 같은 식으로 대체하지 않습니다.
  • 보존되는 Custom Attribute는 파티클당 저장 공간을 사용합니다. 필요한 중간값과 다음 틱까지 유지할 속성을 구분하고 실제 컴파일 결과를 봅니다.
  • NormalizedAge를 곡선의 입력으로 쓰면 수명에 맞춘 변화가 명확해집니다. Age/Lifetime이며 수명 종료 후 제거하지 않으면 1을 넘을 수 있습니다.
  • DI 조회는 필요한 본·표면·데이터만 읽고 동일 샘플을 재사용합니다. 모든 DI와 모든 호출의 비용이 같지는 않습니다.

렌더링과 거리별 품질

  • 입사광이 필요 없다면 Unlit을 검토하되, 조명에 반응해야 하는 먼지·파편에는 적절한 Lit 표현을 유지합니다.
  • Additive도 큰 투명 면적의 오버드로우를 만들 수 있습니다. Masked는 부드러운 반투명을 표현하지 못하므로 성능만 보고 서로 교체하지 않습니다. 알파 0만으로 픽셀 작업이 사라지는 것도 아닙니다.
  • Light Renderer는 라이트 수와 반경을 제한하고 지원하는 그림자 경로의 비용을 따로 봅니다. 모든 버전에 Intensity나 Affect Global Illumination 같은 동일 필드가 있다고 가정하지 않습니다.
  • Mesh Renderer는 메시 복잡도·입자 수·화면 크기·머티리얼 비용을 함께 조절합니다.
  • Effect Type과 Scalability에서 거리·가시성·품질별 생성량과 기능을 명시합니다. LOD Distance 하나가 자동으로 적절한 모듈 조합을 만드는 것은 아닙니다.
  • 텍스처 해상도·밉·압축은 컬러/마스크/노멀 용도와 플랫폼에 맞춥니다. 알파가 필요한 텍스처에서 알파 없는 포맷으로 바꾸지 않습니다.

원거리에서 충돌을 끄거나 생성량을 낮추는 정책은 출발점입니다. 효과가 게임 정보를 전달한다면 멀리서도 필요한 타이밍과 실루엣이 남는지 확인합니다.

측정과 재비교

Niagara Debugger/Outliner에서는 활성 시스템·이미터·파티클 수와 해당 버전이 제공하는 성능 정보를 확인합니다. 모든 모듈의 정확한 CPU/GPU 시간이 자동으로 보인다고 가정하지 않습니다. stat Niagara는 전체 통계를, Unreal Insights는 필요한 트레이스 채널을 켠 CPU/GPU 시간·할당 분석을 도와줍니다.

기준 ms 기록 → 병목 한 축 선택 → 설정 하나 변경 → 같은 장면에서 ms와 시각 손실 비교 순서로 진행합니다. 결과가 예산 안에 들어와도 가까운 장면, 최대 동시 재생, 거리 전환에서 핵심 표현이 유지되어야 합니다.