Asset Bloat Report
Finds obvious build fat under Assets/: large or uncompressed textures, CPU-readable textures, and heavy / DecompressOnLoad audio.
Editor-only. Unity 2021.3+. Lives in Anvil.Editor (includePlatforms: Editor). No extra packages.
Editor window
ArTchie / Anvil / Asset Bloat Report
| Button | What it does |
|---|---|
| Scan | Walks every TextureImporter and AudioImporter under Assets/ (skips Packages/ and Library/). |
| Copy JSON | Puts the report JSON on the clipboard. |
| Write report | Writes <project>/AnvilReports/asset-bloat.json (creates the folder if needed). |
Min Bytes (window field, default 0): include files at least this large even when they have no reason. 0 means reasons only. Assets that already have a reason are always included.
Each texture row also shows source size, maxTextureSize, estimated raw bytes (width * height * bpp), compression, format, crunch, and isReadable. Each audio row shows forceToMono, loadType, quality, and sample-rate settings. bytes is the on-disk file length.
Batchmode (CI)
Unity -batchmode -nographics -quit -projectPath <proj> -executeMethod Anvil.AssetBloatReport.RunBatch -anvil-out <file.json> -anvil-fail -anvil-min-bytes 1048576
| Arg | Meaning |
|---|---|
-anvil-out <file.json> |
Output path. Default: <project>/AnvilReports/asset-bloat.json |
-anvil-fail |
Exit code 1 if any items were listed; otherwise 0 |
-anvil-min-bytes <n> |
Also list files with bytes >= n even with no reason. Default 0 (reasons only). Items with a reason are always included. |
RunBatch only calls EditorApplication.Exit when Application.isBatchMode is true. It logs count= and the output path.
Also accepts -anvil-out=file.json and -anvil-min-bytes=1048576.
JSON
{
"tool": "AssetBloatReport",
"generatedUtc": "2026-08-18T02:00:00Z",
"count": 2,
"items": [
{
"assetPath": "Assets/Art/Hero.png",
"kind": "texture",
"bytes": 345678,
"width": 2048,
"height": 2048,
"maxTextureSize": 2048,
"estimatedRawBytes": 16777216,
"textureCompression": "Uncompressed",
"format": "RGBA32",
"crunchCompressed": false,
"isReadable": true,
"reasons": ["maxSize2048", "uncompressed", "isReadable"]
},
{
"assetPath": "Assets/Audio/Boom.wav",
"kind": "audio",
"bytes": 2000000,
"forceToMono": false,
"loadType": "DecompressOnLoad",
"quality": 1,
"sampleRateSetting": "PreserveSampleRate",
"sampleRateOverride": 0,
"compressionFormat": "PCM",
"reasons": ["fileOver1MB", "decompressOnLoad"]
}
]
}
Reasons
| Reason | When |
|---|---|
maxSize2048 |
Effective maxTextureSize (default + overridden platforms) is >= 2048 |
uncompressed |
TextureImporter.textureCompression is Uncompressed, or a platform format is an uncompressed TextureImporterFormat |
isReadable |
TextureImporter.isReadable |
fileOver1MB |
Audio file length on disk is > 1048576 |
decompressOnLoad |
Default sample settings loadType is DecompressOnLoad |
Required keys on every item: assetPath, kind (texture or audio), bytes, reasons. Extra importer fields are included per kind so agents do not have to re-open the asset.
Notes
- Only assets with a
TextureImporterorAudioImporterare inspected. Generated.assettextures / render textures without an importer are skipped. - Source width/height comes from
TextureImporter.GetSourceTextureWidthAndHeight(Unity 2021.2+), with aTexture2Dload fallback. Estimated raw size iswidth * height * bppfrom the importer format (default 4), not GPU compressed size and not a mip chain. - Default-platform and common overridden platforms (Standalone, Android, iPhone, WebGL, tvOS, WSA) are considered for max size and uncompressed.
- Empty projects and a missing
AnvilReportsfolder are fine (count: 0). - Does not change importer settings. Does not touch runtime player code.
Source in the box: Assets/ArTchie Studios/ArTchie-Suite/com.artchie.anvil/Documentation/AssetBloatReport.md