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.