Quick answer: Move shared assets into a shared bundle. The other bundles reference it (no copy). Memory cost drops by ~N×.
A 4 MB texture used by both Level1 and Level2 ends up in both bundles. Loading both blows 8 MB of memory for one asset.
The Symptom
Profiler shows the same asset GUID at two memory addresses. Bundle sizes mysteriously larger than expected.
The Fix
Assets:
Common/SharedTextures.atlas AssetBundle: shared
Levels/Level1/data.prefab AssetBundle: level1
Levels/Level2/data.prefab AssetBundle: level2
// Level prefabs reference the atlas. Build sees
// the atlas is in shared, references it from level1/level2.
// Atlas appears in shared bundle only. Level bundles only contain refs.
LoadAssetAsync flow:
1. Load shared bundle (deps)
2. Load level1 (refs shared)
3. Use prefab (atlas resolved from shared)
Build pipeline tracks dependencies; only the explicitly-flagged shared bundle holds the asset, others get an AssetReference.
Addressables Path
Addressables → Analyze → Check Duplicate Dependencies. Move flagged dependencies to a Pack Together → Pack Separately group sized for shared assets.
Verifying
Memory Profiler: shared atlas appears once. Total bundle size sum reduced by the asset size × (N-1) where N is bundles previously holding it.
“Shared bundle owns the asset. Others reference. One copy in memory.”
Related Issues
For Addressables content update, see content update. For IL2CPP reflection, see IL2CPP.
Shared bundle. References only. One copy.