Why game installs keep growing while discs stayed the same size
The install sitting on your drive right now is not bloated in the way a cluttered attic is. It is meticulously, systematically packed with multiple forms of the same content: language variants that run separate directories, texture chains that retain every half-resolution step from import onward, and compression choices that trade gigabytes for a few milliseconds of load time. The disc in the box has been thirty-gigabytes-and-change for decades. The install has not. It has grown because modern packaging treats that drive space not as a scarce commodity but as a resource to be sacrificed to loading behaviour, and it does so in ways that are entirely documented if you know where to look.

Language packs are a weight you can remove
Developer documentation makes plain that language packs can be delivered separately, meaning an initial download does not need to haul every locale onto the system. The packs sit in their own directory, identified by a naming convention that ends in “lang,” and a title can ship with several of them side by side. A platform packaging system goes further: a platform packaging system can tag chunks with a Languages attribute so content specific to one or more languages is ring-fenced, kept apart from the core asset set. In theory, then, deleting French voice lines or Japanese subtitle textures should be as clean as removing a folder. In practice, not every title exposes those chunks as optional install components. Installation guidance states plainly that not every component should be made optional unless there is a good reason, which means a number of required language sets sit on the drive long after the player has set their preference.
The texture chain that never quite ends
Every texture in a modern game is stored not as a single image but as a mip-map chain. Unreal Engine says mip-map generation creates a mip-map chain made of multiple levels of the sample image, each half the resolution of the one before. Those levels are generated during import, and they exist from the moment the texture enters the project. The chain does not stop at the resolution your display actually needs. Higher-resolution mip levels can be reserved for cinematic usage and streamed in when the corresponding texture group is set to cinematic quality, storing full-precision data that may never touch the screen during normal play. That means your install carries a version of the hero’s face at a resolution that only makes sense in a render target that runs once every ten hours, if at all, and it carries it for every asset group that a cinematic camera might one day frame.
Assets are stored more than once, for a reason
Game guidance says that if the same assets are used across consecutive scenes or levels, they should be loaded only once. That is the ideal. The install, however, can tell a different story. Running a packaged build with Unreal Engine’s -fileopenlog command-line option records the order in which files are opened, and the documentation advises exercising every level, playable character, weapon, and vehicle before quitting so the log captures the full footprint of what the engine actually touches. When you comb through that log, you see something the guidance does not state outright: assets that appear in multiple streaming zones are often duplicated to keep disc reads physically local, reducing the seek distance the storage hardware must travel. The available developer documentation does not explicitly confirm that deliberate duplication is a prescribed practice, but the file-open pattern is consistent and repeatable across builds. It is a space-for-seek-time trade executed without a press release.
Compression is not a simple win
The word “compression” sounds like an obvious fix, but the reality is a tangled web. Android’s guidance notes that a disk-efficient compression method can improve load times, and that developers can bundle uncompressed versions of assets with the game’s APK. Unreal Engine says that compressing cooked packages can decrease loading times, yet it also reads: “Steam’s differential patch system works better with uncompressed files.” Compressed .pak files save space on the customer’s system, but that same compression can make a patch larger because the delta algorithm cannot find a clean diff inside the compressed blob. You are left with a three-way pull: disk space, load time, and patch size. Optimising any one of them means the other two move in the opposite direction. A title that ships with uncompressed audio or looser texture packing is not lazy; it is answering a question about which of the three pains the studio least wants its players to notice.
How to trace exactly what fills an install
You cannot audit an install by staring at its folder size, but you can map its weight with a disciplined trace. The method relies on tools the engine already provides.
- Launch the packaged build with the
-fileopenlogcommand-line option, which writes every file access to a log. - Play through every major area of the game: load every level, switch to every playable character, equip every weapon, enter every vehicle. The documentation is explicit that you must exercise the whole product before quitting so that nothing is left in a cold path.
- Close the game and open the file-open log. Scan the listed paths for the naming convention that ends in “lang” and for directories that match language-code structures, which identifies every language pack the engine touched. Cross-reference with the platform’s packaging manifest to see which chunks are tagged with a Languages attribute and therefore removable if the storefront exposes them as optional.
- Inspect the log for the same asset path appearing from different streaming locations, which reveals duplication. Note which assets repeat and which streaming zones they serve. Those are the space-for-locality trade-offs.
- Separate compressed and uncompressed asset openings. Uncompressed
.pakfiles or raw texture data will often sit alongside compressed variants. Weigh the load-time cost against the space recovered by using the tools the platform provides to deliver compressed payloads where patch behaviour allows.
The install is large not because it is full of junk but because it is full of choices—choices about which language you might speak, which resolution a camera might need, how few milliseconds a seek can tolerate, and whether the patch that arrives next week should be small or the initial download should be light. The trace turns a shapeless complaint into a ledger. What you delete after is between you and the launcher.