Texture memory: usually the real budget

Where a project actually runs out of room, and the settings that decide it.

Most projects hit a texture memory ceiling before a geometry one. It is also the budget most often accounted for incorrectly.

How much a texture costs

Roughly width × height × bytes per pixel, plus about a third again for mip-maps. An uncompressed 4096×4096 RGBA texture is tens of megabytes. Compressed, it is a fraction of that — which is why compression is mandatory rather than optional.

The mistake is measuring source files. A 2MB PNG is not 2MB in memory; it is decompressed to raw pixels and then re-compressed to a GPU format, and the result may be larger or smaller than the file.

The levers, in order of impact

  • Compression format. The difference between compressed and uncompressed is several-fold. Nothing else comes close.
  • Resolution. Halving dimensions quarters the memory.
  • Channel packing. Three greyscale maps in one RGB texture instead of three textures.
  • Sharing. Atlases and trim sheets mean fewer, larger textures serving more surfaces.
  • Mip-map settings, and streaming, which keeps only the needed levels resident.

Streaming

Most engines stream textures, loading higher mip levels as objects come close. That converts a hard memory limit into a bandwidth and pop-in problem, which is usually the better trade — but it means the resident set is dynamic and profiling has to account for it.

Auditing

Sort every texture by memory cost and look at the top of the list. There are almost always a handful of textures at unnecessary resolution — a 4K map on an object that is never seen closely, or an uncompressed normal map that slipped through import settings.

That audit typically recovers more than any geometry work.

Generated assets

Generated textures arrive at whatever resolution the generator produced, in a source format, with import settings defaulted. All three are decisions waiting to be made — and accepting them is the most common way generated assets blow a memory budget.