
1. 영상 정보
- 영상 제목: Optimizing Niagara for Performant Worlds | Unreal Fest Orlando 2025
- 채널명: Unreal Engine
- 영상 링크: https://youtu.be/71c5yv-XeY8
2. 핵심 요약 (Conclusion)
- 나이아가라(Niagara) 시스템의 성능 최적화를 위한 탑다운(Top-down) 관점의 아키텍처 분석 및 프로파일링, 시스템 틱(Tick) 제어 워크플로우를 다룹니다.
- 콘솔 명령어(stat Niagara), 나이아가라 디버거(Niagara Debugger), 언리얼 인사이트(Unreal Insights)를 결합하여 스레드별(Game Thread, Render Thread, Worker Thread) 부하를 정밀하게 진단하는 방법론을 제시합니다.
- 이펙트 타입(Effect Types) 기반의 컬링 및 중요도 관리(Significance Manager), 이미터 레벨의 확장성(Emitter Scalability) 세팅을 통한 전역 최적화 규칙을 수립합니다.
- 오브젝트 반환 및 가비지 컬렉션 부하를 최소화하는 이펙트 풀링(Pooling) 정책과 고강도 교전 상황에서 동적으로 입자를 제어하는 FX 버짓(FX Budgets)의 활용법을 다룹니다.
- 언리얼 엔진 5.4 이상에서 도입된 라이트웨이트 이미터(Lightweight Emitters)와 나이아가라 데이터 채널(Niagara Data Channels)을 사용하여 시스템 개수 자체를 줄이고 벌크(Bulk) 연산으로 전환하는 차세대 VFX 파이프라인 구조를 정립합니다.
3. 타임라인별 상세 정리
1. 나이아가라 개요 및 기본 아키텍처 (00:00:01 ~ 00:04:07)
- 발표자 및 세션 목표 (00:00:01): Tanglewood Games의 시니어 테크니컬 아티스트 Adam Kurali가 진행하며, 완성된 콘텐츠를 수정하지 않고 시스템 틱 개수와 연산 오버헤드를 낮추는 실무 중심의 최적화 기법을 소개합니다. [01:14]
- 나이아가라 시스템(System)의 역할 (00:02:44): 월드와 직접 인터페이스하는 메인 컴포넌트입니다. 하나 이상의 이미터를 포함하며, 전역적으로 접근 가능한 사용자 파라미터(User Parameters)와 시스템 단위의 확장성(Scalability)을 제어합니다. [03:13]
- 이미터(Emitter)의 구조 및 상속 (00:03:14): 입자의 스폰(Spawn), 시뮬레이션(Update), 렌더링(Render)을 담당하는 모듈 스택(Stack of Modules) 구조입니다. 이미터 자산은 템플릿 형태로 다른 시스템에 상속될 수 있어, 확장성 규칙이나 렌더러 변경 사항을 다수의 시스템에 동시에 전파하기 용이합니다. 단, 이미터는 독립적으로 월드에 존재할 수 없고 반드시 시스템에 포함되어야 합니다. [03:41]
2. 스탯 명령어를 통한 성능 이슈 진단 (00:04:08 ~ 00:07:45)
- 통상 프로파일링의 한계 (00:04:08): stat FPS와 stat unit은 기본적인 스레드 시간만 보여줄 뿐, CPU 병렬 연산 및 GPU 시뮬레이션을 동시에 수행하는 나이아가라의 복잡한 부하를 세분화하여 파악할 수 없습니다. [04:23]
- stat Niagara overview 활용 (00:04:37): 렌더 스레드, 게임 스레드, 그리고 워커 스레드(GT Concurrent)의 누적 비용을 집계합니다. 워커 스레드 수치가 높을 경우 코어 수가 적은 하드웨어(예: 닌텐도 스위치 등)에서 심각한 프레임 드롭을 유발하므로 정밀 모니터링이 필수적입니다. [04:57]
- stat Niagara 세부 비용 항목 (00:05:26): 시스템 연산과 입자 수가 증가할 때 게임 스레드 비용에 영향을 주는 호출을 추적합니다. 특히 GPU 시뮬레이션 이펙트라 하더라도 컴퓨트 셰이더 구동을 위한 GPU 디스패치(Dispatch) 오버헤드가 렌더 스레드(RT)에 고스란히 반영된다는 점을 인지해야 합니다. [05:55]
- 시스템 및 이미터 단위 분석 (00:06:25): stat Niagara systems 명령어는 개별 시스템의 경로와 스레드별 비용을 포맷팅하여 표시하므로 문제 자산을 직관적으로 탐색할 수 있습니다. stat Niagara emitters는 특정 이미터가 어떤 시스템 내에서 병목을 일으키는지 상호 참조 형태로 제공합니다. [06:56]
3. 나이아가라 디버거 및 에디터 툴박스 (00:07:46 ~ 00:10:53)
- 나이아가라 디버거 개요 (00:07:46): 에디터 내 상단 툴 메뉴(Tools > Debug > Niagara Debugger)를 통해 실행 가능한 종합 진단 도구입니다. 패키징 빌드에서는 사용이 제한됩니다. [07:50]
- 디버그 HUD(Debug HUD) 인터페이스 (00:08:14): 월드 내 이펙트의 실시간 성능 데이터, 확장성 상태를 시각화하며, 프로파일링이 까다로운 GPU 컴퓨트(GPU Compute) 비용의 추정치를 제공합니다. 가시성(Visibility)이나 렌더러가 비활성화되었음에도 백그라운드에서 불필요하게 틱이 가동 중인 시스템을 잡아내는 데 효과적입니다. [08:53]
- FX 아웃라이너(FX Outliner) 활용 (00:09:00): 특정 프레임의 스냅샷을 캡처하여 해당 나이아가라 시스템을 소유한 액터(Actor), 풀링 상태(Active/Culled 등), 이미터 개수, 입자 수, 시스템 인스턴스 정보 등을 격자 형태로 상세히 나열합니다. 특정 이미터나 시스템 이름을 기준으로 필터링하여 노이즈를 제거할 수 있습니다. [09:39]
4. 언리얼 인사이트(Unreal Insights) 정밀 프로파일링 (00:10:54 ~ 00:14:24)
- 프로파일링 필수 설정 (00:11:14): 트레이스(Trace) 캡처를 시작하기 전에 반드시 콘솔 명령어 또는 시작 파라미터로 stat named events를 활성화해야 합니다. 이 설정이 누락되면 나이아가라의 세부 함수 및 시스템 단위 프로파일링 이벤트가 데이터에 기록되지 않습니다. [11:19]
- 언리얼 인사이트의 장점 (00:11:35): 에디터 외부의 독립 패키지 빌드에서도 타임라인 기반의 프레임 컨텍스트와 로그, 북마크 기능을 제공하며 캡처된 트레이스 파일의 이식성이 높아 협업에 유리합니다. [11:40]
- 나이아가라 오버헤드 판별법 (00:11:57): 성능 저하가 나이아가라 자체의 문제인지, 혹은 특정 블루프린트가 캐릭터 스폰 시 과도하게 많은 이펙트를 동시에 부착하여 발생한 연쇄 반응인지 역추적할 수 있습니다. 타임라인 뷰에서 NS_ 또는 System 키워드로 검색하면 다중 워커 스레드에 분산된 나이아가라 매니저 비용과 스켈레탈 메시 샘플링, GPU 데이터 리드백(Readback) 비용을 시각적으로 격리 분석할 수 있습니다. [13:38]
5. 이펙트 타입(Effect Types) 기반 컬링 및 시스템 제어 (00:14:25 ~ 00:25:28)
- 이펙트 타입의 개념 (00:14:26): 텍스처 그룹과 유사하게 자산 형태로 최적화 및 컬링 규칙을 정의하고 이를 다수의 나이아가라 시스템에 일괄 배정하는 백본(Backbone) 시스템입니다. [14:39]
- 확장성 및 업데이트 주기 설정 (00:14:54): 로컬 플레이어가 소유한 이펙트의 컬링 허용 여부를 결정하고, 컬링 조건 체크 빈도(Update Frequency)를 스폰 시 1회(Spawn Only), 매초, 혹은 매 틱 단위로 세밀하게 제어할 수 있습니다. [15:16]
- 컬링 반응(Call Reaction) 모드 (00:15:34): 조건 부합 시 시스템을 완전히 제거하여 재시작을 방지하는 Kill, 시스템을 비활성화한 뒤 범위 내 진입 시 복구하는 Sleep, 그리고 Pause 모드를 지원합니다. [15:54]
- 중요도 관리자(Significance Handler)와 인스턴스 캡 (00:16:18): 기본값 외에 거리 기반(Distance-based) 또는 수명 기반(Age-based) 핸들러를 지정할 수 있습니다. 또한 Max Instance Count를 통해 이펙트 타입별 또는 시스템별로 월드 내 동시 활성 개수의 하드 캡(Hard Cap)을 적용합니다. [17:33]
- 컬링 프록시 모드(Call Proxy Mode) (00:18:06): 완전한 시스템 비활성화 대신, 이미 시뮬레이션이 완료된 다른 인스턴스(예: 월드 내 배치된 수많은 횃불 불꽃 중 하나)의 시뮬레이션 데이터를 복사하여 렌더링 스레드 비용만 지불하고 CPU 틱 비용을 완전히 제거하는 방식입니다. [18:18]
- 가시성 기반 컬링(Visibility Culling) 제어 (00:18:35): 카메라 시야 밖이거나 차폐되었을 때 즉시 틱을 중단할지 여부와 진입 전 사전 체크(Pre-all check) 옵션을 설정합니다. [18:40]
- 라이라(Lyra) 벤치마크 및 실무 가이드 (00:20:55): 5v5 봇 매치 환경에서 이펙트 타입을 적용한 결과, 시각적 차이 없이 활성 나이아가라 시스템 개수가 절반 이하로 감소했습니다. 최악의 프레임 히치(Hitch) 상황에서 렌더 스레드 오버헤드가 3.5ms 이상 절감되었고, 병렬 스레드 비용도 2.15ms 줄어들었습니다. [22:12]
- 실무 셋업 사례 분류 (00:22:31):
- 단발성 이펙트(NE_OneShot): 발걸음, 탄착, 탄피 배출 등은 거리 기반 중요도 핸들러를 적용하고, 시야에서 벗어나면 지체 없이 제거되도록 즉각적인 가시성 컬링(Instant Visibility Culling)을 설정합니다. 단, 캐릭터 피격 스파크처럼 게임플레이에 치명적인 이펙트는 제외합니다. [23:24]
- 지속형 루핑 이펙트(NE_Pickup_Persistence): 아이템 패드 광원처럼 루핑되는 중요 시스템은 최대 인스턴스를 5개 등으로 타이트하게 제한하되, 시야를 급격히 회전할 때 이펙트가 뚝뚝 끊기며 스폰되는 팝인(Pop-in) 현상을 막기 위해 가시성 컬링에 1초의 지연 시간(Delay)을 부여합니다. [24:54]
6. 이미터 확장성(Emitter Scalability) 세부 제어 (00:25:29 ~ 00:27:14)
- 이미터 자체 확장성 모드 (00:25:29): 시스템 설정에 종속되지 않고 개별 이미터의 품질을 독자 제어하기 위해 Scalability Mode를 System에서 Self로 전환합니다. [26:03]
- 파츠별 레이어 분리 최적화 (00:26:42): 캠프파이어 이펙트를 제작할 때, 멀리서도 보여야 하는 메인 화염 스프라이트와 연기 기둥은 유지하되 원거리에서 시각적 비중이 낮은 작은 불똥(Embers) 이미터만 거리별 스폰율(Spawn Count Scale)을 축소하거나 특정 거리 이상에서 아예 틱을 차단하는 정밀 제어가 가능해집니다. [27:02]
7. 글로벌 퀄리티 레벨 및 플랫폼 오버라이드 (00:27:15 ~ 00:30:04)
- 나이아가라 퀄리티 레벨 연동 (00:27:15): 이펙트 타입 설정의 확장성 트랙은 언리얼 엔진의 전역 그래픽 설정 옵션인 SGFX Quality 및 콘솔 변수 FX.NiagaraQualityLevel (0~4)에 대응합니다. [27:42]
- 플랫폼별 디바이스 프로파일 최적화 (00:28:24): 확장성 에디터(Scalability Editor) 내에서 플랫폼별 오버라이드를 추가할 수 있습니다. 예를 들어, 스팀덱 환경을 고려하여 린눅스(Linux) 플랫폼이거나 닌텐도 스위치 환경일 때 최고(Epic) 사양 세팅이 구동되지 않도록 강제 차단하고, 플랫폼 전용 그래픽 레이어 세팅을 별도로 빌드할 수 있습니다. 블루프린트를 일일이 수정하지 않고 나이아가라 에디터 내부에서 전역 제어가 가능합니다. [29:13]
8. 이펙트 풀링(Pooling) 및 가비지 컬렉션 최적화 (00:30:05 ~ 00:34:36)
- 풀링 적용 대상 선정 (00:30:05): 빈번하게 생성되고 파괴되는 이펙트의 오브젝트 천(Churn) 현상과 이로 인한 가비지 컬렉션(GC) 프레임 히치를 방지하기 위해 풀링을 활성화합니다. 지속 시간이 짧고 반복 사용 주기가 30초 내외인 회복 마법 효과 등이 주요 대상입니다. [31:01]
- 초고빈도 스폰의 대안 (00:31:11): 머즐 플래시나 탄피처럼 초당 수십 발씩 발사되는 시스템은 매번 풀에서 꺼내는 것보다, 시스템을 월드에 상주시키고 서비스 형태로 구동하는 'System as a Service' 구조가 유리합니다. 블루프린트에서 불리언(Boolean) 변수 틱을 켜고 끄는 방식으로 이미터 활성화를 제어합니다. [31:28]
- 메모리 및 오버런 관리 (00:31:39): 엔진 기본값으로 나이아가라 시스템은 32개의 풀 사이즈(Max Pool Size)를 가집니다. 레벨 로딩 시 미리 메모리를 할당하는 프라임 사이즈(Pool Prime Size)를 과도하게 잡으면 메모리 오버헤드가 발생하며, 반대로 스폰량이 풀 사이즈를 초과하면 오버런(Overflow) 인스턴스들은 풀링되지 못하고 가비지 컬렉터로 넘어가므로 이펙트 타입의 시스템 제한 수치와 풀 크기를 상호 보완적으로 정렬해야 합니다. [33:38]
- 스폰 정책 적용 (00:33:48): 블루프린트나 C++ 단에서 스폰 함수 호출 시 풀링 정책을 Auto Release 또는 Manual Release로 명시해야 합니다. 단발성 이펙트는 비활성화 시 자동으로 풀에 반환되는 Auto Release를 사용하고, 캐릭터 부착형 상태 이상 이펙트처럼 특정 이벤트 시점에 해제해야 하는 시스템은 Manual Release를 적용한 뒤 명시적으로 풀에 반환(Release to Pool)해야 합니다. 그렇지 않으면 메모리 누수 경고가 발생합니다. [34:25]
9. FX 버짓(FX Budgets) 및 동적 부하 제한 (00:34:37 ~ 00:37:42)
- FX 버짓 메커니즘 (00:34:37): 전투 씬 등 화면 내 이펙트 밀도가 급증할 때 게임 스레드와 렌더 스레드에 할당된 프레임 타임 예산을 초과하지 않도록 시스템 인스턴스 개수와 컬링 거리를 실시간 동적 스케일링하는 기능입니다. [35:14]
- 동적 제어 및 부하 밸런싱 (00:35:52): effects.Budget.Enabled 및 관련 콘솔 변수를 통해 활성화하며, 구체적인 예산 상한선은 구성 INI 파일에 명시합니다. 예산 소모율이 50% 또는 100%에 도달할 때 발걸음 먼지 같은 비필수 이펙트 타입 레이어를 통째로 거부(Nuke)하는 글로벌 버짓 규칙을 연동할 수 있습니다. [36:39]
- 요동 현상 방지 옵션 (00:37:24): 부하가 차단되어 성능이 일시적으로 회복되면 다시 이펙트가 무더기로 스폰되어 성능이 요동치는 루프 현상이 발생할 수 있습니다. 이를 방지하기 위해 버짓 회복 속도를 강제로 지연시키는 effects.Budget.AdjustedUsageDecayRate 변수를 조정하여 복구 그래프를 완만하게 다듬어야 합니다. [37:37]
10. 라이트웨이트 이미터(Lightweight Emitters) 활용 (00:37:43 ~ 00:40:16)
- 개념 및 태생적 한계 (00:37:43): 언리얼 엔진 5.4에 도입된 기능으로, 과거 캐스케이드(Cascade)의 고정 기능(Fixed Function) 방식처럼 스크래치 패드(Scratch Pad) 접근을 제한하고 동적 입력을 차단하여 나이아가라 시스템 객체의 오버헤드와 메모리 점유율을 극한으로 낮춘 형태입니다. 기본 기능은 제한적이지만 프로젝트 사정에 맞춰 C++로 확장할 수 있습니다. [38:53]
- 성능 비교 데이터 (00:39:05): 10개의 AI 봇이 월드를 질주하며 발걸음 먼지를 일으키는 환경을 시뮬레이션한 결과, 기존 표준 나이아가라 이미터 세팅에서는 게임 스레드 오버헤드가 1.3ms에 달하고 2.7MB의 메모리를 점유했습니다. [39:41]
- 라이트웨이트 전환 결과 (00:39:48): 동일한 비주얼 조건을 유지한 상태에서 라이트웨이트 이미터로 교체하자 게임 스레드 비용이 200微초(0.2ms)로 대폭 감소했으며, 메모리 점유율 또한 원래 크기의 10분의 1 수준인 0.27MB로 단축되는 압도적인 최적화 효율을 보여줍니다. [04:06]
11. 나이아가라 데이터 채널(Niagara Data Channels) 파이프라인 (00:40:17 ~ 00:45:47)
- 차세대 연산 구조 (00:40:17): 언리얼 엔진 5.3에 도입되어 5.5까지 지속 고도화된 기능입니다. 월드에 수많은 개별 나이아가라 시스템 컴포넌트를 스폰하는 구조에서 탈피하여, 이펙트의 생성 위치와 속성 데이터(Payload)만 전용 데이터 채널에 쓰고, 단 하나의 전역 마스터 나이아가라 시스템이 이 채널을 구독(Read)하여 모든 입자를 대량 스폰 및 벌크 시뮬레이션하는 중앙 집중형 아키텍처입니다. 언리얼 엔진 5.5부터는 우클릭 마법사 메뉴를 통해 컨텍스트 구현이 가능해졌습니다. [40:32]
- 채널 유형 분화 (00:41:49):
- 이미터 스택 설계 규칙 (00:42:42): 이미터 시스템 단에서 데이터 채널 리더(Data Channel Reader) 오브젝트를 매번 인스턴스화하지 않도록 시스템 사용자 파라미터 영역에서 초기화 플로우를 처리합니다. 이미터 업데이트 스택에는 입자 스폰 조건문(Spawn Conditional) 모듈을 추가하고, 채널 내 스폰 데이터가 일정 시간 인입되지 않으면 인스턴스를 소멸시키는 Complete If Unused 모듈을 장착해야 합니다. 입자 스폰 시점에는 채널 페이로드에서 위치, 속도, 수명 데이터를 디코딩하여 적용합니다. [43:11]
- 블루프린트 연동 및 결과 (00:44:29): 블루프린트 단에서는 단발성 시스템 스폰 노드 대신 Write Niagara Data Channel (단일 객체용) 또는 뱃치(Batch) 노드를 사용하여 데이터를 주입합니다. 속성창의 세 가지 불리언 필드(Visible in BP / Niagara CPU / Niagara GPU)를 통해 데이터가 바인딩될 타깃 시뮬레이션 레이어를 지정합니다. [45:05]
- 최적화 전후 지표 분석 (00:45:11): 다량의 화기를 연사할 때 개별 시스템 스폰 방식은 순간적으로 게임 스레드 비용을 600ms 수준의 극단적인 프레임 드롭 상태로 몰고 가지만, 데이터 채널 방식으로 전환 시 월드 중앙의 단 하나의 관리자 시스템 틱 비용만 남게 되므로 게임 스레드 부하가 그래프 상에서 완벽하게 평탄화(Flat)되는 효과를 얻을 수 있습니다. [45:43]
12. 최적화 매트릭스 가이드 및 Q&A (00:45:48 ~ 종료)
- 이펙트 카테고리 분류 (00:45:48): 리소스 관리 효율을 극대화하기 위해 월드 내 모든 이펙트를 게임플레이 필수(Gameplay Critical) 자산과 비필수(Non-Gameplay Critical) 자산으로 철저히 양분할 것을 권장합니다. [46:03]
- 기능 간 상호 배타성 주의 (00:46:11): 이펙트 타입, 확장성, 풀링은 상호 결합하여 시너지를 낼 수 있습니다. 그러나 나이아가라 데이터 채널(Niagara Data Channels)과 라이트웨이트 이미터(Lightweight Emitters)는 기술적으로 동시 적용이 불가능합니다. 라이트웨이트 이미터 구조 안에서는 데이터 채널 리더 모듈 구동에 필요한 커스텀 노드 및 동적 데이터 바인딩 연산 로직을 처리할 수 없으므로, 자산의 복잡도와 스폰 빈도에 맞춰 단일 라이트웨이트 시스템으로 갈지, 혹은 마스터 데이터 채널 시스템으로 합칠지 양자택일해야 합니다. [46:27]
'이펙트 (FX) > 이펙트 팁 : Unreal' 카테고리의 다른 글
| [Unreal/Optimizing] Optimizing the Game Thread | Unreal Fest 2024 요약 (0) | 2026.07.08 |
|---|---|
| [Unreal/Material] Custom Primitive Data 소개 (0) | 2026.07.08 |
| [Unreal/Niagara] 나이아가라 모듈 스크립트에서 원하는대로 분기 처리하기 (NMS, Enum, Static Switch) (0) | 2026.06.19 |
| [Unreal/Niagara] 나이아가라 모듈 스크립트 GPU Fixed Bounds 설정법 (0) | 2026.06.12 |
| [Unreal/Niagara] 나이아가라 네임스페이스 정리 (0) | 2026.06.10 |
댓글