Gaming

DDS in Games: Why Engines Love BC and DXT Compressed Textures

You load up a vast open world, thousands of surfaces appear almost instantly, and somehow the video memory holds. Behind that magic sits the humble .dds file and block compression that the graphics card decodes right while it draws. Let's unpack why engines picked DDS, how it rescues VRAM and holds the frame rate, and where texture compression is heading next.

A gaming PC with RGB lighting and a powerful graphics card — the hardware DDS was built for
Every frame in a game is a race against milliseconds and megabytes of VRAM. DDS helps you win both. Photo: Pexels

Why DDS is the native tongue of game engines

DDS (DirectDraw Surface) was invented by Microsoft all the way back in DirectX 7.0 (September 1999), and over a quarter of a century this container became the unofficial standard for PC-game textures. The reason is simple: DDS is the one common format that can store a texture already in the form the graphics card expects it. Not a "picture for a human," but a ready-to-upload block of VRAM data with mipmaps, cubemaps and the right compression type packed inside a single file.

Any other format — PNG, JPG, TGA — the engine first has to decode on the CPU into a full-size uncompressed RGBA buffer, then re-encode into a GPU format on import. DDS skips that whole ordeal: load the file, hand it to the graphics card. That's why when you dig into the assets of nearly any game, from Skyrim to fresh AAA titles, you will almost certainly run into .dds.

In short

For a game, DDS is a "ready meal the GPU eats straight from the wrapper." It stays compressed in video memory and is decoded in hardware during rendering. That is exactly why engines choose it over PNG.

4×4 blocks and how they save VRAM

The heart of the format is block compression (Block Compression, BCn; formerly known as S3TC or DXT). A texture is sliced into 4×4-pixel squares, and each block is encoded with a pair of reference colors plus a compact set of indices. The crucial part: the graphics card decodes these blocks on the fly, right as it samples a texel — and keeps the texture in VRAM compressed.

The numbers speak for themselves. A BC1 block takes 8 bytes per 4×4 pixels — that's 0.5 bytes per pixel, or 4 bits per pixel. Uncompressed RGBA is 4 bytes per pixel. So BC1 gives 8:1 compression for opaque textures. BC7 and BC6H weigh twice as much — 16 bytes per block (1 byte/pixel) — but that's still 4:1 compression versus uncompressed.

8:1BC1 (DXT1) compression
4:1BC7 compression
0.5 Bper pixel in BC1

To make it tangible: a 4096×4096 texture in uncompressed RGBA is 64 MB. In BC1 it's just 8 MB; in BC7, 16 MB. Now multiply that by hundreds of materials in a single scene, and it becomes obvious why a modern game simply wouldn't fit in video memory without compression. Different BC variants are tuned for different jobs.

FormatOld nameBits/pixelBest for
BC1DXT14Opaque color textures, smallest size
BC3DXT58Textures with smooth transparency
BC4 / BC54 / 8Height and normal maps (DX10, 2006)
BC6H8HDR textures (DX11, 2009)
BC78Maximum color quality (DX11, 2009)

Why compressed textures mean a stable FPS

Here's the counterintuitive bit. It seems like decoding should slow rendering down — but in practice compression speeds it up. The win isn't in the decode (that's free, baked into the GPU's texture units in hardware); it's in memory bandwidth.

Every frame the graphics card reads millions of texels from VRAM. If a texture is uncompressed, each pixel costs 4 bytes of traffic over the memory bus. In BC1, it costs 0.5 bytes. That's 8 times less data to push through memory on every sample. In scenes with lots of materials, the memory bus is often the bottleneck — and compressed textures relieve it, helping hold an even frame with no dips.

The paradox of game rendering: unpacking data is cheaper than reading it. Compressed textures don't save CPU cycles — they save precious memory bandwidth.

As a bonus, compressed textures sit better in the GPU cache: more texels fit into the same cache line, which means fewer misses and fewer trips to slow video memory. So the tech-artist rule is unambiguous: don't disable texture compression without a very good reason — it's almost always a win, on both memory and speed.

A detailed game world with many textured surfaces
Every surface in this scene is a separate material with textures. Without block compression they wouldn't fit in VRAM. Photo: Pexels

Texture streaming and fighting pop-in

Even at 8:1 compression, an open world's textures add up to tens of gigabytes — while a top-tier graphics card rarely has more than 16–24 GB of VRAM. The answer is texture streaming. The engine keeps only the mip levels that are actually visible right now in video memory and streams in more detailed versions from disk as you approach objects.

DDS is perfect here again: the texture is already split into mipmaps and stored compressed, so streaming individual levels is fast and cheap. Streaming has a "budget" — a fixed amount of VRAM for all streamable textures. When a scene exceeds the budget, the engine doesn't evict textures wholesale; it gracefully lowers their resolution by using smaller mip levels in place of the full-size ones.

The flip side of streaming — texture pop-in

If the data can't load in time (slow disk, tight VRAM budget), you see a texture "sharpen up" before your eyes: blurry first, crisp a moment later. That's texture pop-in. A fast NVMe drive and a sensible VRAM budget are the main cures for this artifact.

Modern engines go further with virtual texturing: instead of whole textures, they load only the visible fragments (tiles). That makes it possible to show surfaces at extreme resolution while keeping only a tiny fraction of their full size in VRAM.

Mipmaps and LOD in a real scene

Mipmaps are pre-scaled copies of a single texture: full size, then half, a quarter, an eighth, and so on down to 1×1. They are all stored right inside the DDS file. When an object is far from the camera, the GPU has no reason to read a 4096×4096 texture — it grabs a smaller mip level.

That delivers two effects at once. First, the unpleasant "shimmering" of distant surfaces (aliasing) disappears: a fine texture on a far-off wall no longer turns into noise. Second, the GPU reads less data and uses the cache more efficiently — rendering gets faster. Mipmaps are texture LOD (level of detail) in action.

The price of admission

A full mipmap chain grows a texture's size by only about 33% (the geometric series 1 + 1/4 + 1/16 + …). For that small surcharge you get both a smooth picture in the distance and a tangible speed boost. A deal no engine ever turns down.

Texture budgets: PC versus consoles

A texture budget is the unspoken contract between artist and hardware: how much VRAM you can spend before the game starts to stutter. On PC the picture is messy — one player has an 8 GB card, another has 24. So engines set a conservative streaming pool by default (in Unreal Engine it's around 1000 MB, up to 2000 MB depending on quality settings) and scale detail to the specific system.

The common tech-artist rule of thumb is to keep texture memory usage below roughly 75% of available VRAM, leaving headroom for frame buffers, shadows and the rest of the render's needs. Overshoot, and you get constant swapping and micro-stutters.

~1000 MBdefault streaming pool (UE)
75%safe VRAM ceiling
16 GBunified memory, PS5 / Xbox Series X

On consoles things are different — and in some ways simpler. The PS5 and Xbox Series X carry 16 GB of unified memory, shared between CPU and GPU, plus a blazing-fast NVMe SSD. That combination lets them stream textures so aggressively that noticeable pop-in has all but vanished on current-gen consoles. A fixed configuration is a blessing for developers: the budget is known up front, so every asset can be tuned to it — something you can never pull off across the patchwork of PC hardware.

An esports match on a big stage — a stable FPS is critical here
In competitive games a stable frame matters most — and compressed textures play their part in keeping things smooth. Photo: Pexels

Engine support: Unreal, Unity, CryEngine, Source

Every leading engine works natively with block-compressed textures, and DDS is the natural container for them:

  • Unreal Engine. On import, textures are compiled to BCn: BC1/BC3 for color, BC5 for normals, BC7 for high-quality maps on PC and consoles. The built-in streamer with a configurable VRAM pool manages mip levels automatically.
  • Unity. For DirectX 11+ GPUs it recommends DXT1 (BC1) for RGB and BC7 where quality matters. There's also Crunch — a layer on top of DXT that further shrinks the texture on disk (it doesn't affect runtime memory, but it cuts build size).
  • CryEngine. Historically one of the most texture-hungry engines; DDS with precomputed mipmaps is its core working asset format.
  • Source / Source 2. Uses its own VTF container, but it's built on the very same DXT/BC compression formats — and for exchange and modding it all comes back to DDS.
1

The artist authors the texture

The source is painted at high resolution in PNG or TGA — a lossless, edit-friendly format.

2

The engine compresses to BCn

On import the texture is re-encoded to the right BC format and gets a mipmap chain — a DDS-like asset.

3

The GPU renders on the fly

In game, the graphics card reads the compressed blocks straight from VRAM and decodes them in hardware in real time.

Where it's all heading: BC7 and trends

Old reliable BC1 is alive and well — for many textures the quality loss at 8:1 compression is practically invisible, and the space saving is worth it. But the flagship format of the modern PC is BC7. It supports up to 8 bits per channel and reproduces gradients, skin and skies — where BC1 visibly falls apart — far more cleanly. By the objective PSNR metric, BC7 delivers more than 42 dB against 35–40 dB for BC1 — a gap the eye catches on complex transitions.

The cost of that quality is double the size (8 bits/pixel versus 4). So production runs on a hybrid principle: BC1 for opaque color, BC3 for transparency, BC5 for normals, and BC7 for the headline "hero" textures the player examines up close.

What's on the horizon

The BCn family remains the standard for PC and consoles, while ASTC rules on mobile. In parallel, supersampling and neural texture upscaling are gaining ground, alongside "GPU-resident" techniques like sampler feedback and virtual texturing — none of which replace block compression; they're built on top of it. DDS, as a container for compressed textures, isn't going anywhere for a long time yet.

Dug into a game's files and found a .dds?

Open the game texture in a couple of seconds: the free FormatZ converter turns DDS into an ordinary PNG right in your browser — no install, no sign-up.

Convert DDS to PNG

Want to put an edited texture back into the game? The reverse conversion comes in handy — PNG to DDS with a choice of compression type. And the full list of supported conversions is always on the all formats page. If you're just getting into the topic, start with the guide "What Is DDS", and for hands-on practice see our piece on game modding with DDS textures.

Because DDS block compression stays compressed right in video memory, and the graphics card decodes the 4×4 blocks in hardware during rendering. PNG or JPG would have to be unpacked into a full-size uncompressed buffer, which would burn far more VRAM and memory bandwidth. DDS saves both space and speed.
The main win is not decoding but memory bandwidth. A compressed BC1 block takes 8 times fewer bytes than uncompressed RGBA, so the GPU reads less data per pixel. That eases the load on the memory bus and helps hold a stable frame, especially in scenes with hundreds of textures.
It is a technique where the engine keeps only the mip levels that are actually visible right now in VRAM and streams more detailed versions from disk as you get closer to objects. That lets an open world with tens of gigabytes of textures fit into limited video memory. The downside is texture pop-in, where a texture visibly sharpens before your eyes.
BC1 (DXT1) for opaque color textures where size matters most. BC3 (DXT5) for textures with smooth transparency. BC5 for normal maps. BC7 for maximum color quality on PC and modern consoles: it is noticeably cleaner on gradients, skin and skies, but it is twice the size of BC1.
Convert the DDS to PNG with the FormatZ online converter — the texture opens in Photoshop, GIMP or Paint.NET. After editing, send it back through the PNG → DDS converter and pick the right compression type (for example BC3/DXT5 for transparency). That is the basic texture-modding loop.