
Texture Compression in Unity: ASTC vs BC7 vs ETC2 and What to Actually Use
You imported a gorgeous 4K texture, dropped it on your character, and your mobile build ballooned by 40MB while the frame rate quietly sagged. The texture looks fine. The problem is how it is stored. Texture compression is the single biggest lever most Unity devs never touch, and getting it wrong costs you VRAM, download size, and battery. Getting it right is mostly picking the correct format per platform and then leaving it alone.
Here is the honest, no-fluff version of what these formats do and which one to actually use.
Why compression matters more than you think
An uncompressed RGBA texture stores 32 bits per pixel, which is 4 bytes per texel. A single 2048x2048 texture at that rate eats about 16MB of GPU memory. Stack a few dozen of those and a mid-range phone runs out of room, starts thrashing, and your frame time spikes for reasons the profiler makes look mysterious.
Compressed formats cut that down hard. Most drop you to 4 or 8 bits per pixel, so that same 2048 texture lands around 2MB to 4MB instead of 16. The GPU also samples compressed textures faster because it moves less data across the memory bus. So compression is not just a build-size trick. It is a runtime performance win too.
The wrong format does not usually crash your game. It quietly doubles your memory budget and you never notice until a cheap device does it for you.
The desktop and console formats: BC7, BC6H, DXT
On PC and console you are living in the BC (Block Compression) family. There are two you actually care about.
BC7 is your default for high-quality color textures with or without alpha. It runs at 8 bits per pixel and produces very clean results, close enough to uncompressed that you will not spot the difference on most art. The catch is that BC7 is slow to compress, so big projects feel it at import time. That is a one-time cost, not a runtime one, so pay it.
BC6H is the one people forget. If you are storing an HDR texture, like a skybox or a lightmap with values above 1.0, BC6H is built for it at 8 bits per pixel. Do not shove HDR data into a standard format and wonder why your sky bands.
The older DXT1 (BC1, 4 bits per pixel, no real alpha) and DXT5 (BC3, 8 bits per pixel with alpha) still show up as Unity defaults. They compress fast and look worse than BC7. Use them when import speed matters more than quality, or for textures nobody looks at closely. Otherwise reach for BC7.
The mobile story: ASTC vs ETC2
Mobile is where people get burned, because the format that runs great on your test phone might not exist on a user's cheaper one.
ASTC is the modern answer and should be your first choice on both iOS and Android. Apple devices support it from the A8 chip (2014) onward, and most Android GPUs that run OpenGL ES 3.1 or Vulkan support it too. The magic of ASTC is the variable block size. A smaller block stores more bits per pixel and looks better. ASTC 4x4 gives you 8 bits per pixel (best quality, biggest), while ASTC 12x12 drops all the way to about 0.89 bits per pixel (smallest, roughest).
A practical starting point: ASTC 6x6 for most textures, which lands around 3.56 bits per pixel and looks great for the size. Bump critical stuff like character skins and UI to ASTC 4x4 or 5x5. Push background props and things the player never gets close to toward 8x8. You tune per texture, not per project.

UV layout maps every texel to a surface. Image via Wikimedia Commons.
ETC2 is your fallback for older Android hardware. Any GPU running OpenGL ES 3.0 supports it, so it catches devices that predate widespread ASTC. ETC2 RGB is 4 bits per pixel and ETC2 RGBA is 8 bits per pixel. The quality is a step below ASTC, but it keeps your game running on hardware you would otherwise abandon. If your analytics show a real slice of old-device users, ship ETC2 for them.
Crunch: the part everyone misunderstands
Crunch compression trips people up constantly. Crunch is a second layer of lossy compression that sits on top of DXT or ETC. It shrinks your build size and download, sometimes dramatically. That is real and useful, especially for a mobile store listing where every megabyte of download matters.
Here is the trap. Crunch does nothing for runtime memory. At load time the texture decompresses back to full DXT or ETC in VRAM, so it takes exactly the same GPU memory as it would without Crunch. It also lowers quality and is slow to compress. So Crunch is a download-size tool, not a performance tool. Use it when your install footprint is the problem, not when your frame rate is.
The settings that quietly wreck your textures
A few things bite almost everyone at least once.
Keep dimensions to powers of two (256, 512, 1024, 2048) whenever you can. Non power of two textures compress badly, mip poorly, and sometimes refuse block compression entirely, falling back to uncompressed. That 4096x3000 photo you dropped in is probably sitting uncompressed in memory right now.
Normal maps are their own animal. They are not color data, and squashing them with a standard color format smears the surface detail you paid for. Unity has a normal map texture type that picks a sensible format, so mark them correctly. If you want the full story on why that green channel matters, our normal maps explainer walks through the DirectX versus OpenGL flip that ruins them.
And do not blanket-set everything to maximum quality. A UI icon, a hero character, and a distant rock have wildly different needs. Overriding per platform in the importer takes ten seconds per texture and is the difference between a lean build and a bloated one. It is the same mindset that separates a genuinely game-ready asset from one that just looks fine in a screenshot, which we broke down in what game-ready actually means.
A quick default to steal
If you want a starting rule set: BC7 for PC and console color textures, BC6H for HDR, ASTC 6x6 as your mobile baseline with 4x4 for characters and UI, ETC2 only if your device data demands it, and Crunch reserved for when download size is the specific thing you are fighting. Then profile, find the two or three textures eating the most memory, and hand-tune those. You will get most of the win from a handful of assets.
Compression is boring, which is exactly why it is worth doing well. The art you buy or build is only as good as how it ships. If you are hunting for textures and asset packs that come import-ready instead of fighting you, that is the sort of thing DevLoot exists to sort out.