CVar Reference with Measured Impact
UE5 has thousands of CVars. About thirty actually move milliseconds when you flip them. This is that thirty — with default values, recommended-tier overrides, and measured impact from cited sources (AMD GPUOpen RX 7900 XTX measurements, Tom Looman's 5.5/5.6 highlights, Epic docs). Numbers are anchored to specific hardware/scenes; they are candidates to investigate on your project, not universal recommendations. Verify on your hardware.
r.Lumen.HardwareRayTracing — HW is faster on RTX. Always re-measure before blanket-flipping.
Top 30 Impact CVars
| # | CVar | Default | Recommended (Low/Med/High) | Measured Impact | Source |
|---|---|---|---|---|---|
| 1 | r.Lumen.HardwareRayTracing | 1 | 0 / 0 / 1 (AMD); 1 (NVIDIA RTX) | ~1.2 ms saved on RX 7900 XTX | GPUOpen UE Perf Guide |
| 2 | r.Lumen.ScreenProbeGather.StochasticInterpolation | 0 | 1 / 1 / 1 | ~30% screen probe gather speedup | GPUOpen UE Perf Guide |
| 3 | r.Lumen.ScreenProbeGather.IntegrateDownsampleFactor | 1 | 2 / 2 / 1 | ~3× faster integrate; 0.3–0.5 ms at 1080p console (5.6) | Tom Looman 5.6 |
| 4 | r.LumenScene.FarField.OcclusionOnly | 0 | 1 / 1 / 0 | ~50% Far Field speedup on console (5.6) | Tom Looman 5.6 |
| 5 | r.Lumen.ScreenProbeGather.MaxRayIntensity | 10 (5.6); was 40 | 10 / 10 / 10 | More aggressive firefly clamp; reduces noisy variance | Tom Looman 5.6 |
| 6 | r.Lumen.HardwareRayTracing.ShaderExecutionReordering | 0 | 0 / 1 / 1 | 20–30% Lumen reflections on RTX 40 (CitySample) | NVIDIA SER blog |
| 7 | r.Lumen.Reflections.RadianceCache | 0 | 1 / 1 / 0 | Reflection dispatch saving on RDNA 3 | GPUOpen UE Perf Guide |
| 8 | r.Lumen.ScreenProbeGather.SpatialFilterNumPasses | 3 | 1 / 2 / 3 | Linear cost reduction per pass dropped | GPUOpen UE Perf Guide |
| 9 | r.Nanite.RasterSort | varies | 1 / 1 / 1 | Nanite raster sorting (5.5+) | Tom Looman 5.5 |
| 10 | r.Nanite.MinPixelsPerEdgeHW | 16 | 32 / 32 / 32 | HW vs SW raster crossover (RDNA 3) | GPUOpen UE Perf Guide |
| 11 | r.Nanite.StaticGeometryInstanceCull | 0 | 1 / 1 / 1 | ~100 µs saved in CitySample (5.6 chunk culling) | Tom Looman 5.6 |
| 12 | r.Nanite.Streaming.StreamingPoolSize | 512 MB | 384 / 512 / 1024 | Adjustable runtime in 5.5; cuts hitches on large worlds | Tom Looman 5.5 |
| 13 | r.Nanite.AllowWorkGraphMaterials | 0 | 0 / 0 / 1 | Work-graph material path on D3D12 (5.5) | Tom Looman 5.5 |
| 14 | r.Shadow.Virtual.UseReceiverMaskDirectional | 0 | 1 / 1 / 1 | Static pages stay cached, dynamic pages mask-driven (5.6) | Tom Looman 5.6 |
| 15 | r.Shadow.Virtual.Clipmap.CullDynamicTightly | 1 | 1 / 1 / 1 | Tighter far-cull plane reduces VSM-rendered geometry (5.6) | Tom Looman 5.6 |
| 16 | r.Shadow.Virtual.SMRT.SamplesPerRayLocal | 8 | 4 / 6 / 7 | Visible frame-time gain, "nearly imperceptible" quality loss | GPUOpen UE Perf Guide |
| 17 | r.Shadow.Virtual.SMRT.SamplesPerRayDirectional | 8 | 4 / 6 / 7 | Linear cost reduction with sample count | GPUOpen UE Perf Guide |
| 18 | r.Shadow.RadiusThreshold | 0.01 | 0.06 / 0.04 / 0.01 | Mobile defaults 0.06; culls small casters | CVar wiki |
| 19 | r.Shadow.MaxResolution | 2048 | 512 / 1024 / 2048 | Halving cuts shadow depth-pass cost ~4× per cascade | CVar wiki |
| 20 | r.TSR.AsyncCompute | 1 | 1 / 2 / 2 | TSR moved to async compute on RDNA 3; overlaps GPU work | GPUOpen UE Perf Guide |
| 21 | r.TSR.History.ScreenPercentage | 200 (Epic AA) | 100 / 100 / 200 | Up to 1.2 ms saved at 4K on 7900 XTX | GPUOpen UE Perf Guide |
| 22 | r.TSR.ThinGeometryDetection | 0 | 0 / 1 / 1 | Improves temporal stability for foliage/hair (5.6) | Tom Looman 5.6 |
| 23 | r.PSOPrecaching | 0 | 1 / 1 / 1 | Eliminates first-frame compile hitch (UE 5.2+) | Epic Docs |
| 24 | r.PSOPrecache.ProxyCreationWhenPSOReady | 1 | 1 / 1 / 1 | Defers proxy until PSO ready — pop instead of hitch | Epic Docs |
| 25 | r.Streaming.PoolSize | -1 (engine-managed) | 400 / 800 / 1000+ MB | Mobile 85 MB; undersize triggers blurry textures, oversize wastes VRAM | CVar wiki |
| 26 | r.VT.PageFreeThreshold | 15 (5.6); was 60 | 15 / 15 / 15 | Reduces VT pool residency under camera motion (5.6) | Tom Looman 5.6 |
| 27 | r.MegaLights.DownsampleFactor | 1 | 2 / 2 / 1 | 2× downsample roughly halves MegaLights cost (5.6) | Tom Looman 5.6 |
| 28 | tick.AllowBatchedTicks | 0 | 1 / 1 / 1 | Cuts TaskGraph overhead by batching same-class ticks (5.5) | Tom Looman 5.5 |
| 29 | s.UseUnifiedTimeBudgetForStreaming | 0 | 1 / 1 / 1 | Shares budget between async-loading and level-streaming (5.6) | Tom Looman 5.6 |
| 30 | gc.TimeBetweenPurgingPendingKillObjects | 60 | 90 / 60 / 30 | Extending interval cuts GT GC spikes; shortening helps churn-heavy gameplay | CVar wiki |
Categories at a Glance
- Lumen / GI (1–8): HW vs SW raytracing, screen probe gather knobs, far-field occlusion. Highest single-CVar impact.
- Nanite (9–13): RasterSort, HW/SW crossover, 5.6 instance culling, streaming pool, work-graph materials.
- VSM (14–17): Receiver-mask caching, clipmap culling, SMRT sample counts.
- Shadows (18–19): RadiusThreshold for small-caster cull, MaxResolution.
- TSR / Upscaling (20–22): Async compute, history percentage, thin geometry.
- PSO Precaching (23–24): ProxyCreationWhenPSOReady is the hitch defeat.
- Streaming / Memory (25–26, 29): Texture pool, virtual texture release threshold, unified streaming.
- Lighting Particles (27): MegaLights downsample.
- Game Thread (28, 30): Batched ticks, GC interval.
5.5 / 5.6 Changed Defaults to Audit on Upgrade
| CVar | Pre-5.5 | 5.6 default | Why audit |
|---|---|---|---|
r.Lumen.ScreenProbeGather.MaxRayIntensity | 40 | 10 | Tighter firefly clamp; brightness/highlight changes silently |
r.VT.PageFreeThreshold | 60 | 15 | Reduces VT pool residency; verify your VT pool sizing |
r.pso.EnableAsyncCacheConsolidation | 0 | 1 | New 5.5 default; async PSO consolidation removes startup spike |
| Async render thread | off | parallelized | Up to 2× render-thread perf on some platforms |
DumpCVars
DumpCVars r.Lumen -setby=DeviceProfile,Scalability,Code shows which subsystem set each CVar. Reading INI alone doesn't tell you what's actually being applied. Use this before changing any value — you might be fighting a Device Profile override.
Caveats
r.Streaming.PoolSize=-1(auto) does not use per-tier values fromBaseScalability.ini— you must set a positive value or usesg.TextureQuality.r.Shadow.RadiusThresholdAndroid/iOS default is 0.06 across all tiers — cinematic 0 will tank mobile.r.TSR.History.ScreenPercentage=200is the "Epic AA" default; dropping to 100 frees ~1.2 ms at 4K on 7900 XTX with measurable quality drop in motion only.tick.AllowBatchedTicksis opt-in despite the 5.5 framework being enabled by default.r.pso.EnableAsyncCacheConsolidationexists specifically to disable the new 5.5 async behavior and restore the old path if it regresses your title.r.Nanite.StaticGeometryInstanceCullis disabled by default in 5.6 due to known failure modes despite "significant gains for GPU-generated PCG" — opt in per scene.
PerfGuard can record DumpCVars r. -setby=DeviceProfile,Scalability,Code at capture time and surface CVars that changed between baseline and candidate runs — highlighting any row from this Top-30 table in red. Auto-attribution: "this regression coincides with r.Lumen.HardwareRayTracing 0 → 1, expected impact ~1.2 ms per AMD measurements." Suggested rollback shows the most-likely-causal CVar by overlapping per-CVar measured-impact range with observed ms delta.