ArTchie Studios

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 TextureImporter or AudioImporter are inspected. Generated .asset textures / render textures without an importer are skipped.
  • Source width/height comes from TextureImporter.GetSourceTextureWidthAndHeight (Unity 2021.2+), with a Texture2D load fallback. Estimated raw size is width * height * bpp from 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 AnvilReports folder 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