An 8K texture behind a screen nobody looks at

The cave level reported roughly 1.3 GiB of texture memory. The tempting read is that it's a level-authoring problem (too much stuff in one map) and the tempting fix is to start deleting props. I checked the second version of the level first. Same 1.3 GiB, dominated by the same assets. When two differently-authored levels land on the same number, the level is not the variable.

So I pulled asset-registry tags across every Texture2D in the project rather than eyeballing the map. 2,421 textures. 1,915 of them, 79%, were B8G8R8A8. No compression, four bytes per pixel, full resolution, and flagged never to stream out.

One import preset, applied everywhere

The shared cause was a combination that gets applied to anything that touches UI: `CompressionSettings = TC_EditorIcon`, `LODGroup = UI`, `NeverStream = True`. Individually each is defensible. Together they mean full resolution, uncompressed, permanently resident. Nobody chose that for 1,915 assets. It is what you get when the first person to import a UI texture picks the settings that make the icon look crisp, and everyone after that copies the import preset.

The worst single asset was a death-screen backdrop at 7680×4320, uncompressed, never streamed. 168 MB. For a background behind a screen you see when you die.

My favourite one was less dramatic and more instructive. The stat upgrade icons were authored at 4961×3508. That is A4 at 300 DPI, print resolution, for something that renders about 80 pixels wide in a menu. And they had already been superseded by fixed variants, which is what the game actually referenced. The originals just never left.

The lever I picked, and why

There were two obvious levers. Change `CompressionSettings` from TC_EditorIcon to BC7, which is alpha-safe and roughly a 4× saving. Or set `MaxTextureSize`, which caps resolution at cook time without touching the source art at all.

I used MaxTextureSize first, on ten in-use textures. It is fully reversible, it needs no re-import, and it needs no art review, because the source file is untouched. That last part is what actually mattered on a team: nobody had to approve anything or redo work. One quirk worth knowing: Unreal rounds to a power of two, so asking for 1920 gets you 2048. Still an 8K to 2K cut on the worst offender.

One caution I want on the record, because it is the mistake I can see someone making off the back of this post: do not blanket-disable NeverStream on UI textures. It is set for a reason: it stops HUD elements popping in. Once the textures are small it stops mattering. Turn it off because the size is fixed, not to fix the size.

The part that didn't land

Separately from the resizing, I found 20 textures with zero referencers, verified rather than assumed, worth about 1.3 GB between them. Concept sheets, superseded icons, sketchbook pages. Pure deletion, nothing points at them.

I deleted them through the editor's asset tools and the numbers moved. Then I checked git. No deletions staged. The `.uasset` files were all still on disk; the delete had only removed them from the running editor's asset registry, and they would come back the moment anyone restarted. So the 1.3 → 1.0 GiB win is real and committed, and the 1.3 GB of dead textures is still sitting in the repository. It is on the list, honestly labelled, and I would rather say that than quietly fold a number I did not actually achieve into the total.

What I'd do differently

Set the import preset once, at the start, and make it the boring correct one. Every hour of this audit existed because a default was wrong in month one and then propagated by copying. There is no clever version of this lesson.