PSA: Unity already flags your Addressables duplicate bloat — just scattered across 3 tools, and the worst are marked "Unfixable"

Spent a while profiling a production Addressables project — one bundle per scene — and Unity’s own Build Report hit me with this: 337 duplicate assets, “up to 1.84 GB” of potential savings, in a build whose bundles totaled 1.3 GB. Sounded impossible until I understood what was going on. Posting it because the worst part is nearly invisible and I wish I’d known years ago.

Why it happens: Addressables only de-dupes what you explicitly mark. Everything those assets reference — the textures behind your materials, the fonts behind your UI — are implicit dependencies, and every bundle that needs one bakes in its own copy. One bundle per scene turns that into a multiplier: a shared texture used by 6 scenes ships 6 times, and nothing warns you at runtime.

The part that got me: the biggest offenders were sitting in a Resources/ folder — a 65.9 MB TMP font atlas baked into 60 bundles. And here’s the trap: “Check Duplicate Bundle Dependencies” silently skips anything under Resources/, because those aren’t valid Addressable candidates. So the analyze rule everyone runs will never show them — the post-build Build Report does (it reads the real build layout), but only after you’ve built and shipped.

How to actually find them before you ship: Addressables does have a rule that catches these — “Check Resources to Addressable Duplicate Dependencies” (CheckResourcesDupeDependencies) — but it’s filed under Unfixable Rules in the Analyze window and almost nobody runs it. (“Unfixable” because the fix is a refactor — move the asset out of Resources/ — so it flags them and shrugs.) Run it alongside the usual “Check Duplicate Bundle Dependencies”.

The fix:

  • Resources offenders: move them out of Resources/ and reference them directly / make them Addressable — the Resources/ copy ships regardless otherwise. (For TMP, reference fonts on components or via TMP Settings instead of the Resources default.)

  • Everything else: mark the duplicated assets Addressable in one shared group, so referencing bundles just reference a single copy.

Verify it worked with the official duplicate count before/after, plus a plain du -sh on the build output. On mine: duplicate assets 337 → 5, build folder 1.3 GB → 808 MB on disk. Nothing deleted, downscaled, or recompressed — just packed once instead of N times.

Full writeup with the Build-Report screenshots.

To be clear, none of this is a secret Unity hides — it’s all in their own Analyze rules and the Build Report. The catch is it’s spread across three separate places, the biggest offenders are filed under “Unfixable,” and nothing ranks them by actual waste, so you’d never know a single font was your worst problem until you went looking. Connecting those dots is the whole point.

(Disclosure, so I’m not being sneaky about it: I got tired of doing this by hand and built a Unity editor tool that wraps both official rules and does the extraction with a before/after check — free local scan, nothing uploaded. But the mechanism above is worth knowing even if you never touch the tool; that Resources/ gotcha in particular bit me for a long time.)

5 Likes

Honestly - totally hear you, and great guide.

You’re not the first person or studio to hit this, & tbh we need to do a lot better in the engine.

In 6.6, for local content (content bundled with the player) we’ll start shipping a new format (Content Directories) which will offer an alternative to AssetBundles which has implicit deduplication. It will only reference and load each artifact once. Because you’re already using Addressables, it will be a straight backend swap with no changes to API.

Through future versions of Unity, it will be expanded to handle remote content, and include implicit deduplication at download time too. We’ll talk (a little) more about this at Unite Seoul later this month.

We are also investing in 6.7 in starting to consolidate our build tooling because you’re spot on - the multiple tools situation sucks - you should have one place to go to understand the output of your builds. We’re working on it.

The issue with TextMeshPro assets being in Resources is still an issue, so I’ll pick that up and bring it to the text team, so thanks for that.

So TLDR; you’re right. Thank you for the guide, it will be useful to others. We’re (hopefully) making it better soon, but there’s a ways to go.

I hope the situation is better in 6.6. I’ll drop you a DM, and if it’s not then please drop me an email and we’ll make sure we’re on top of it.

9 Likes

I came here just out if curiosity and discovered that finally someone is encountering my exact problems with Addressables and someone at Unity has finally acknowledge the fact that Unity can do much better than this. Stunned :distorted_face:

2 Likes

Yeah, being real. I get it.

The dependency / duplication issue has been a problem in Unity for way too long. I can talk about the reasons why, but honestly we should have fixed it - we are fixing it.

My team has been full-steam ahead on Content Directories since 2023, and we’re excited to talk about them more in the run-up to 6.6.

The ultimate goal we’re working towards is you shouldn’t have to think about content structure at all. Your game should just build, load, and download exactly what you want. We’re still a ways off, but 6.6 is the first step in that direction + the right architecture to build on.

Interested to get your feedback too, I’ll drop you a DM!

3 Likes

Thanks George — genuinely didn’t expect a response this candid from the engine team, and it’s really encouraging.

Content Directories sound like exactly the right direction, especially “load each artifact once” as a straight backend swap for existing Addressables users. Will definitely be watching Unite Seoul.

And +1 on consolidating the build tooling. The painful part isn’t just that there are several tools — it’s that they disagree: “Check Duplicate Bundle Dependencies” skips Resources entirely, the rule that does catch them sits under “Unfixable,” and the only place you see the full picture is the post-build Build Report — after you’ve already shipped. One consistent, pre-build view of “here’s what’s duplicated and what it costs” would be huge.

Happy to share more concrete feedback if it’s useful — I’ve spent a fair bit of time in these rules lately and have opinions on what that “one place” would ideally surface (waste ranking, a Resources-vs-bundle split, and a before/after dedup count so “it worked” is measured, not vibes).

On TMP specifically: the nasty part is it ships twice by design — the Resources copy always goes in the player, and every scene bundle referencing a TMP label bakes another. Marking the font Addressable in place doesn’t help; you have to move it out of Resources first. Happy to hand the text team a concrete repro if that helps.

DM very welcome — would love to go deeper.

:heart:

Please do, that would be super useful - either in the thread or via DM. Very interested to hear what your “ideal” tool would show.

Yeah, I’ve made a note to talk to them next week. We have some ideas of how we’d solve it in a future version of Content Directories, but agree it’s a pretty messy integration with Addressables in the meanwhile.

Happy to — here’s the shape I’d want, kept to principles rather than a full spec:

  1. One pre-build view, ranked by real cost (size × copy count). The single 65 MB font baked 60× has to sit at the top — a list sorted by name or raw size buries the thing that actually matters.

  2. Grouped by fix type, not just by rule. “Move out of Resources” and “mark Addressable in a shared group” are completely different actions; today they’re split across a Fixable and an Unfixable rule, so people never see them as one problem with two remedies.

  3. Close the loop: act, then verify. Apply the fix from that same view, then re-run the same authoritative analysis to show the duplicate count before/after — so “it worked” is a number, not a hope.

One-line philosophy: it should tell you what to do next and whether it worked, not just list facts.

That’s roughly what I ended up building into PerfLint — if seeing it live is more useful than paragraphs, I’m happy to hand you a build to poke at (would genuinely value your team’s eyes on it). Happy to go deeper over DM/email either way.

And thanks for taking the TMP case to the text team — I’ll put together a clean repro for them.

Whoa this feels like big news! I feel like my calls to replace asset bundles might’ve actually been heard.

Will this move to Content Directories also overcome the limitations of memory management that asset bundles have?

This is great, thank you so much! I’ve linked this thread in our internal Slack :slight_smile:

Ha. Well. If you want a fun peek behind the curtain. Every Friday we (the Addressables / Build team) go through the forum to answer questions / collate feedback together, and I know your posts have come up a bunch, & we’ve exchanged DMs before (thanks again!)

& Yes, Content Directories were designed to give you full granular control over what you load & unload into memory. I do want to moderate excitement though. We’re 100% sure this is the right technical direction, but it’s also the first release - we both expect plenty of bugs & this is just the first step in a long roadmap.

We’re excited to get it into peoples hands and start iterating together.

1 Like

I’m pretty confident that if this is 100% sure the right technical direction, bug fixing will be less painfull than using addressables itself :sweat_smile:

1 Like

Still sounds like exciting news over the long term. There’s a lot of projects out that are going to benefit from this (namely anything open world).

Excited to see how this progresses, even if it might be mostly invisible by being underneath Addressables.

I imagine it will have to be an opt-in back end?

Just an FYI. We’re taking the rest of your feedback, but we’re also going to ditch that name in the next version of Addressables. We agree that term really doesn’t make sense. Thanks!

100%. I’m really hoping (long term) Addressables can evolve to something being quite a bit simpler. It’s really built around the limitations of AssetBundles.

E.g. With Content Directories, we’ll continue to have Addressables groups because it’s important that AssetBundles + CD can exist side-by-side in a project and we maintain Addressables continuity, but they aren’t actually technically necessary any more.

It will, and honestly I expect AssetBundles to continue to be supported for a long-long time, even once Content Directories support the remote-content use case. Fully appreciate that a ton of Unity customers have been operating live-service games with AssetBundles for a decade+ - no intention of impacting that.

The philosophy we’re working with is (long term) we have to make Content Directories so immensely awesome in comparison to AssetBundles, that everyone desperately wants to switch.

2 Likes