Guide
Diagnosing and Fixing Level Streaming Hitches in Unreal Engine
A step‑by‑step diagnostic guide for identifying and fixing Unreal Engine level‑streaming hitches, with checks, fixes, verification, and when to escalate.
Published by Tasadduq Burney
02 May 2026, 05:20 UTC
4 min132.1K views0

Recognizable condition
When playing or testing a level, you notice sudden frame‑time spikes (hitches) each time a new level or sub‑level begins to stream. The hitch often coincides with increased memory allocation messages and warnings such as "Async loading took X ms" or "Streaming request queued" in the Output Log.
Quick cause / diagnostic table
| Symptom | Likely cause |
|---|---|
| Frequent hitches with large streaming radius | Excessive streaming request size/frequency |
| Many "Async loading thread saturated" warnings | Insufficient async loading thread pool |
| High memory usage when a specific sub‑level loads | Heavy assets (high‑poly meshes, large textures) not marked for streaming |
| Long disk‑read times in stat file | Disk I/O bottleneck |
| Streaming priority warnings for certain levels | Misconfigured streaming distance or priority |
Ordered checks
- Review Streaming Settings
- Open World Settings → Streaming Settings.
- Note the
Streaming DistanceandPriorityvalues for each level. - Inspect any Level Streaming Volumes in the level for overlapping or overly large radii.
- Correlate hitches with engine stats
- Run the game in editor or standalone.
- Open the console (
`) and enterstat unitandstat streaming. - Watch the frame‑time graph; hitches should appear as spikes in the
GameorDrawcolumns. - Check the
Streamingcolumn for spikes in async load time or request count.
- Verify async loading thread count
- In console, type
r.AsyncLoadingThreadCountto see the current value. - Alternatively, check
DefaultEngine.iniunder[/Script/Engine.Engine]forAsyncLoadingThreadCount.
- In console, type
- Profile disk usage
- Enter
stat fileto see read/write bytes per frame. - On Windows, use PerfMon or Resource Monitor; on consoles, use the platform’s IO profiler (e.g., Xbox ETW, PlayStation Razor).
- Look for sustained high read bandwidth (>80 % of device capability) coinciding with hitches.
- Enter
- Inspect asset sizes and LOD usage
- Open the Content Browser, enable
View → Show Engine Contentif needed. - Right‑click a mesh or texture →
Asset Detailsto see memory size. - For static meshes, verify that
LOD Settingshave appropriate screen‑size thresholds. - For textures, ensure they belong to a
Texture Streaming Groupwith a reasonableMax Resolution.
- Open the Content Browser, enable
Fixes tied to findings
1. Reduce streaming request size/frequency
- Decrease the
Streaming Distancein World Settings or shrink the radius of Level Streaming Volumes. - Split overly large levels into smaller sub‑levels so each streaming request handles less data.
- Example: change a volume radius from 5000 uu to 2500 uu and re‑test.
2. Increase async loading thread pool
- In console:
r.AsyncLoadingThreadCount 6(adjust number based on CPU cores). - To persist: add
AsyncLoadingThreadCount=6toDefaultEngine.iniunder[/Script/Engine.Engine]. - Note: raising this value adds CPU overhead; test on target hardware to avoid thread contention.
3. Optimize heavy assets
- Generate LODs for high‑poly meshes (
Static Mesh → LOD Settings → Generate LODs). - Compress textures and assign them to a streaming group with lower
Max Resolution(e.g., 1024 for mobile). - Mark large assets as
Streamablein their details panel if they are not already.
4. Alleviate disk I/O bottlenecks
- Move the project to an SSD/NVMe drive if currently on HDD.
- Enable asynchronous IO: in
DefaultEngine.inisetbUseAsyncIO=trueunder[/Script/Engine.FileSystemSettings]. - On consoles, verify that the title’s IO priority is set correctly via platform SDK.
5. Adjust streaming priority via Blueprint
- Use the
Set Streaming Levelnode and expose aPrioritypin. - Assign higher priority to levels that must appear instantly (e.g., gameplay‑critical areas) and lower priority to ambient scenery.
- Test with
stat streamingto confirm that priority changes affect load order.
Escalation criteria
- If hitches persist after applying all applicable fixes above.
- If the Output Log repeatedly shows "Streaming timeout" or "Out of memory" errors despite adequate RAM.
- When platform‑specific traces (e.g., GPUView, Razor, ETW) indicate that the hitch originates outside of UE’s streaming subsystem (e.g., driver stall).
- In these cases, capture a profiling session (
stat fileoutput, Unreal Insights trace, or platform‑specific capture) and provide it to Engine Support or the platform vendor.
Verification steps
- Before any change, record a baseline: run a typical play‑through, enable
stat unitandstat streaming, and note the frequency and magnitude of frame‑time spikes. - After each fix, repeat the same play‑through and compare the graphs; a successful fix should reduce or eliminate the spikes associated with the streamed level.
- Check the Output Log for streaming warnings; they should diminish or disappear.
- On target hardware, use a frame‑time analysis tool (Radeon GPU Profiler, Intel VTune, or platform equivalent) to confirm a smoother frame‑time distribution (e.g., 90th‑percentile frame time below the target threshold).
Limitations and cautions
- Increasing
r.AsyncLoadingThreadCount can raise CPU usage and cause thread contention on low‑core devices; always validate on the intended hardware. - Aggressively lowering streaming distances may cause pop‑in or missing geometry; walk through the affected areas to verify visual fidelity after each adjustment.
- Changing
bUseAsyncIOmay require a full rebuild of platform binaries on some consoles; consult the platform documentation before enabling.
0 replies
A thoughtful contribution can make all the difference. Be the first to share one.