← Back to Blog optimization

Texture streaming in UE5: pool size, budgets, and GLB asset workflow

By BitSoul Team7/17/2026Updated 8/1/20264 min read86 views
Texture streaming in UE5: pool size, budgets, and GLB asset workflow

Virtually every visual performance problem in UE5 traces back to texture streaming somewhere in the call stack. Texture streaming in Unreal Engine 5 is the system that decides which mip levels live in GPU memory at any given moment — and when it's misconfigured, the symptoms range from subtle texture pop-in to hard GPU memory overflows that degrade entire scenes. This guide covers how the pool works, how to size it for your project, and how to prepare imported GLB assets so they participate in streaming correctly.

How UE5 texture streaming works

UE5's texture streaming system — built on the Mip Streaming subsystem — evaluates screen-space texel density for every visible mesh each frame. Assets far from the camera receive lower mip levels; assets filling the screen demand their highest-resolution mips. The system operates on a fixed budget: the texture streaming pool, measured in MB, is a hard cap on total GPU texture memory for streamed textures.

When pool demand exceeds supply, UE5 evicts lower-priority mip levels — typically belonging to distant or off-screen objects. Consistent overflow manifests as textures stuck at low resolution close to the camera, or visible pop-in when the camera pans.

How UE5 texture streaming works — illustrated

Three key concepts govern the system:

Setting the right texture streaming pool size

The default UE5 pool size is 1000 MB for desktop builds — undersized for asset-heavy scenes with multiple high-res PBR texture sets. Override it in `Config/DefaultEngine.ini` for a persistent project setting:

```ini
[/Script/Engine.StreamingSettings]
r.Streaming.PoolSize=3000
```

Or test interactively in the console without restarting:

```
r.Streaming.PoolSize 3000
```

Platform targets:

| Platform | Pool Size | Notes |
|---|---|---|
| High-end PC (12 GB+ VRAM) | 3000–5000 MB | Supports multiple 4K PBR sets |
| Mid-range PC (8 GB VRAM) | 1500–2500 MB | Leave headroom for Lumen/shadows |
| Console (PS5 / XSX) | 2000–3000 MB | Hardware budgets cap effective gains |
| Mobile | 256–512 MB | Requires aggressive compression |
| VR (standalone) | 128–256 MB | Minimize texture dimensions first |

A practical rule: allocate 40–50% of available VRAM to the streaming pool. The remainder covers render targets, shadow maps, and Lumen screen-space buffers. For environment-heavy builds assembled from BitSoul's marketplace asset packs, 2000–3000 MB is a reliable desktop baseline.

Diagnosing streaming issues with stat commands

Diagnosing streaming issues with stat commands — illustrated

UE5 exposes real-time streaming metrics you can read in-editor or in development builds. These are the commands to reach for first:

Overall pool status:
```
stat streaming
```
Watch `Pool Size` vs `Required Pool Size`. If required consistently exceeds available, the system is dropping mip levels and visual quality will suffer.

Per-group breakdown:
```
stat texturegroup
```
Breaks streaming pressure by group. High counts in `World` or `Character` groups usually point to oversized base textures that should be downsampled or reassigned.

Visual budget overlay:
```
r.Streaming.ShowTextureStreamingMetrics 1
```
Color-codes meshes in the viewport by streaming priority. Red meshes are requesting mips the pool cannot supply.

Force immediate full-resolution load for testing:
```
r.Streaming.MaxTexturesInFlight 500
r.Streaming.Boost 100
```
Reset with `r.Streaming.Boost 1` before any real performance profiling.

Optimizing GLB assets for texture streaming

GLB files from BitSoul's marketplace embed PBR textures directly in the binary. When UE5 imports a GLB, it extracts those textures and assigns them to the World texture group by default — fine for hero props, but wasteful for background dressing.

Common problem 1 — Oversized base textures

GLB assets often ship at 2K or 4K. Background props viewed from 10+ metres are indistinguishable at 512px while consuming 16× less pool budget. Batch-reassign texture groups for low-priority assets using the UE5 Python API:

```python
import unreal

asset_registry = unreal.AssetRegistryHelpers.get_asset_registry()
textures = asset_registry.get_assets_by_class("Texture2D")

for t in textures:
tex = unreal.load_asset(t.object_path)
if tex:
tex.set_editor_property(
"lod_group",
unreal.TextureGroup.TEXTUREGROUP_World_Low_Detail
)
unreal.EditorAssetLibrary.save_asset(t.object_path)
```

Common problem 2 — Never Stream flag

Open any imported GLB texture in the Texture Editor and confirm `Never Stream` is unchecked. Textures with this flag always occupy pool space at full resolution regardless of distance — completely defeating the streaming system. This flag is sometimes set by import heuristics on small textures; audit it on any texture smaller than 128×128.

Pre-ship checklist:

With the pool correctly sized and GLB imports properly tagged, texture streaming in Unreal Engine 5 becomes largely automatic. The system does the heavy lifting — your job is giving it an honest budget and assets that don't fight against it. Browse the full texture and environment asset catalogue at bitsoulhosting.com/marketplace to find GLB-format packs already sized for game use.

---

*This post is part of the Ultimate Guide to Free 3D Game Assets — BitSoul's complete reference for formats, texturing, rigging, optimization, and engine integration.*

Tags: unreal optimization texturing game-assets pbr workflow tutorials

Skip the modelling — download it instead

A free BitSoul account gets you 2 game-ready models every month plus 25 AI Engine credits to generate one of your own, no card required. Clean topology, PBR textures, and GLB downloads that drop straight into Unreal, Unity, Godot or Blender — plus OBJ and 3D-printable STL export.

Create a free account → Browse 846 models