Home / Blog / Addressables and Asset Management at Scale

Addressables and Asset Management at Scale

Our build size hit 1.2GB. Addressables brought it down to 85MB + on-demand streaming.

The Asset Bloat Problem

Early in development, our Android build exceeded 1.2GB—unacceptable for a game targeting players in regions with limited mobile data. Most of this was assets that most players would never see: all five realms loaded simultaneously, alternate language voiceover files, high-resolution textures for devices that can't render them, debug tools left in release builds. Traditional Resources folders load everything at startup. We needed granular control over what loads when, and the ability to stream content on-demand. Addressables solved this.

Addressable Asset System Architecture

We organized assets into logical groups: Core (UI, menus, always needed), Realm_Ember, Realm_Abyss, Realm_Nexus, Realm_Void, Realm_Origin, Localization_EN, Localization_ES. Each group compiles to an AssetBundle that can be loaded independently. The Core bundle is ~85MB and includes one starter realm. Additional realms download on-demand (~40MB each) the first time you visit, then cache locally. Localization bundles download based on system language. This reduced initial download from 1.2GB to 85MB—a 93% reduction.

Remote Hosting and Content Updates

Addressables can load from remote URLs (we use Firebase Storage for CDN-backed hosting). This enables content updates without app store submissions—we can add new cosmetics, fix texture bugs, balance difficulty curves by simply uploading new asset bundles. Versioning is automatic: Addressables compares local catalog with remote, downloads changed bundles. Players get seamless updates without reinstalling. We've deployed 17 content updates this way, each taking ~2 minutes to propagate globally versus 2-5 days for app store review.

Memory Management and Unloading

Addressables provides fine-grained memory control. When you leave a realm, we call Addressables.Release() to unload all realm-specific assets, immediately reclaiming memory. DontUnloadUnusedAsset is no longer needed—we control unloading explicitly. We track memory using Unity Profiler and found realm transitions now release 200-350MB instantly. For low-memory devices (detected via SystemInfo.systemMemorySize), we unload previous realm before loading next, ensuring memory usage never exceeds 600MB even on budget Android phones with 2GB RAM.