skills/ue-vfx-niagara-profiler/SKILL.md
Profile Niagara particle systems for performance including particle counts, GPU vs CPU simulation costs, overdraw estimation, and memory usage. Use when optimizing VFX, debugging particle performance, or preparing for console certification. Triggers on "Niagara profiling", "particle performance", "VFX optimization", "particle count", "overdraw", "GPU particles".
npx skillsauth add sipherxyz/universal-ue-skills ue-vfx-niagara-profilerInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Profile and optimize Niagara particle systems for AAA performance targets.
| Category | Budget | Notes | |----------|--------|-------| | Particle Count (screen) | <10,000 | Total visible | | GPU Sim Systems | <20 active | Concurrent | | CPU Sim Systems | <10 active | Per frame | | Overdraw Factor | <4x | Screen pixels | | Memory per System | <50 MB | VRAM |
| Platform | Max Particles | Max GPU Systems | |----------|---------------|-----------------| | PC (High) | 50,000 | 50 | | PC (Medium) | 25,000 | 25 | | PS5 | 30,000 | 30 | | Xbox Series X | 30,000 | 30 | | Xbox Series S | 15,000 | 15 |
# Console commands
stat Niagara # Niagara overview
stat NiagaraDetailed # Detailed breakdown
stat GPU # GPU particle costs
stat Particles # Legacy + Niagara combined
Niagara.DebugHUD 1 # On-screen debug
For each Niagara System, extract:
## System: NS_{SystemName}
### Emitter Configuration
| Emitter | Sim Target | Max Count | Spawn Rate | Lifetime |
|---------|------------|-----------|------------|----------|
| {Name} | {GPU/CPU} | {N} | {N}/s | {N}s |
### Module Costs
| Module | Type | Estimated Cost |
|--------|------|----------------|
| {Module} | Spawn/Update/Render | {Low/Med/High} |
### Renderer Configuration
| Renderer | Material | Overdraw Risk |
|----------|----------|---------------|
| {Type} | {Material} | {Low/Med/High} |
Issue: Emitter "{Name}" spawns {N} particles
Impact: {CPU/GPU} pressure, potential frame drop
Current: SpawnRate={N}, Lifetime={N}s → {MaxCount} particles
Recommendations:
1. Reduce spawn rate: {N} → {Suggested}
2. Reduce lifetime: {N}s → {Suggested}s
3. Add LOD: Cull at {Distance}
| Module | Cost | Alternative |
|--------|------|-------------|
| Collision | High | Depth Buffer Collision |
| Curl Noise Force | High | Pre-baked noise texture |
| Point Attraction Force | Medium | Simplified gravity |
| Mesh Renderer | High | Sprite with normal map |
Issue: System has high overdraw factor
Analysis:
- Particle size: {N} units average
- Particle count: {N} at peak
- Screen coverage: {N}% estimated
- Overdraw factor: {N}x
Recommendations:
1. Reduce particle size by {N}%
2. Use cutout opacity instead of translucent
3. Add depth fade to reduce overlap visibility
4. Implement screen-space particle limit
### LOD Configuration
| LOD Level | Distance | Scale Factor | Spawn Multiplier |
|-----------|----------|--------------|------------------|
| LOD0 | 0-1000 | 1.0 | 1.0 |
| LOD1 | 1000-3000 | 0.75 | 0.5 |
| LOD2 | 3000-5000 | 0.5 | 0.25 |
| Cull | 5000+ | N/A | 0 |
### Missing LOD Issues
- {SystemName}: No LOD configured
- {SystemName}: LOD distances too aggressive
Use GPU Simulation when:
- High particle counts (>1000)
- Simple update logic
- No collision required
- No events/ribbons
Use CPU Simulation when:
- Complex logic branching
- Collision required
- Event-driven spawning
- Ribbon renderers
- Low particle count (<500)
| Issue | Fix | |-------|-----| | Complex material | Simplify shader | | No LOD materials | Add simplified LOD material | | Translucent sorting | Use masked when possible | | Many texture samples | Combine textures, reduce samples |
// Set fixed bounds to avoid recalculation
NiagaraComponent->SetForceSolo(false);
NiagaraComponent->SetRenderCustomDepth(false);
NiagaraComponent->SetRandomSeedOffset(0); // Deterministic for pooling
// Pre-warm and pool
NiagaraComponent->SetWarmupTime(0.5f);
ObjectPool->ReturnToPool(NiagaraComponent);
# Niagara Performance Report: {Context}
## Executive Summary
- **Total Systems Analyzed**: {N}
- **Critical Issues**: {N}
- **Estimated Budget Usage**: {N}%
- **Recommendation**: {OK/OPTIMIZE/CRITICAL}
## Systems Overview
| System | Particles | Sim Type | GPU Cost | CPU Cost | Status |
|--------|-----------|----------|----------|----------|--------|
| {Name} | {N} | {Type} | {ms} | {ms} | {OK/WARN} |
## Critical Issues
### 1. {System Name}
**Issue**: {Description}
**Impact**: {Frame time impact}
**Fix**: {Specific recommendation}
## Optimization Priority
| Priority | System | Change | Expected Savings |
|----------|--------|--------|------------------|
| 1 | {System} | {Change} | {N}ms |
## Budget Compliance
| Metric | Current | Budget | Status |
|--------|---------|--------|--------|
| Total Particles | {N} | 30,000 | {OK/OVER} |
| GPU Systems | {N} | 30 | {OK/OVER} |
| Peak VRAM | {N} MB | 500 MB | {OK/OVER} |
| Command | Purpose |
|---------|---------|
| Niagara.WarmupDeltaTime | Control warmup speed |
| fx.Niagara.AllowGPUParticles | Toggle GPU particles |
| fx.Niagara.MaxGPUParticlesSpawnPerFrame | Limit spawn rate |
| fx.Niagara.Debug.ShowGlobalBudgetInfo | Budget overlay |
Primary Path: /Content/S2/Core_VFX/
| Folder | Purpose | Priority |
|--------|---------|----------|
| 1_COMBAT_EFFECTS/ | Hit impacts, buffs, AOE, character-specific | HIGH |
| 2_ENVIRONMENTAL_EFFECTS/ | Weather, ambient, level VFX | MEDIUM |
| 4_UI_AND_CINEMATICS/ | Screen effects, cutscene VFX | MEDIUM |
| 5_LIGHTING/ | Light-based particle effects | LOW |
| _CORE_ASSETS/ | Shared modules, materials, meshes | Reference |
| _VFX_WORKSPACE/ | WIP effects (exclude from audit) | Skip |
Total Niagara Systems: ~1,197
1_COMBAT_EFFECTS/
├── Area_Of_Effect_AOE/ # Ground slams, explosions, zones
├── Buffs_And_Debuffs/ # Auras, weapon enchants, status
├── Character_Specific/ # Player/enemy unique effects
│ └── Player_Protagonist/
│ └── Fox_Transform/ # Nine-tails transformation VFX
├── Melee_Impact/ # Hit reactions, slashes
├── Projectiles/ # Ranged attacks, thrown objects
└── Trails/ # Weapon trails, dash effects
Area_Of_Effect_AOE/): Explosions, ground effects (high particle count risk)Buffs_And_Debuffs/): Always-on effects (per-character cost)Fox_Transform/): Signature ability (spike potential)Character_Specific/): Phase transitions (budget spikes)2_ENVIRONMENTAL_EFFECTS/): Weather, ambient (always active)Window → Developer Tools → Niagara Review
Or analyze via C++:
TArray<FNiagaraAnalysisResult> Results = FNiagaraAnalyzer::AnalyzeFolder(TEXT("/Game/S2/Core_VFX"));
| Prefix | Type |
|--------|------|
| NS_Combat_AOE_* | Area of effect |
| NS_Combat_Buff_* | Buff/aura effects |
| NS_Combat_Debuff_* | Debuff/status effects |
| NS_Combat_Melee_* | Melee impact/trail |
| NS_Combat_Range_* | Ranged/projectile |
| NS_Env_* | Environmental |
| NS_UI_* | UI/screen effects |
development
This skill should be used when implementing features in isolation using git worktrees. Triggers on "create worktree", "isolated workspace", "parallel development", or when starting implementation that should not affect main workspace.
testing
Manage VFX team issues on GitHub Projects - timeline scheduling, status updates, member commit checks, bulk assign. Use when managing VFX team project board, adding issues to timeline, checking member progress, or bulk-updating issue fields.
tools
Generate C++ validation rules from JSON definitions. Use when team updates ValidationRules.json or asks to add/modify validation rules.
development
Check codebase for Microsoft Xbox XR (Xbox Requirements) compliance issues. Scans for account picker, cloud saves, achievements, Quick Resume, and Xbox certification requirements. Use before console submission or when preparing for Microsoft certification. Triggers on "XR", "Xbox certification", "Microsoft compliance", "Xbox cert", "Xbox requirements", "GDK compliance".