Quick answer: Log per-asset import time, identify the top twenty slowest assets, apply import presets and platform overrides to eliminate unnecessary processing, and set up a shared cache so your team only pays the cost once per change.

Asset reimports are the iteration killer nobody puts on the roadmap. You save a texture, wait eleven seconds. You switch branches, wait three minutes. You clone fresh, wait two hours. Each of these is a solvable problem, but most indie teams just accept the pain because it happens to everyone and the fixes feel like plumbing. This guide walks through the diagnostics and the fixes that most reliably recover lost iteration time.

Measure Per-Asset Import Time

You can’t target the right assets without data. In Unity, open Project Settings > Editor > Asset Pipeline and set Log Verbosity to Detail. Now the Console logs an entry for every asset imported with an elapsed time.

# Example Unity console output (after filtering)
Assets/Textures/Environment/CliffFace_Normal.png   imported in 11.32s
Assets/Models/NPCs/Bandit.fbx                     imported in 8.94s
Assets/Audio/VO/Intro_01.wav                      imported in 4.21s
# 20 more lines...

Copy the log into a spreadsheet or pipe through sort -rk3. Eight times out of ten, 20 assets account for 80% of the reimport budget. That’s your target list.

In Godot, launch with --verbose and grep for Import:. In Unreal, check Saved/Logs/CookLog.txt after a cook and look for LogCook Display: Cook Stats breakdowns, which group by asset class.

Import Presets by Folder

The single biggest win is usually setting up import presets so every asset of a given type gets the right settings automatically. Without presets, every new texture defaults to the engine’s chosen settings — which are almost always wrong for your use case.

In Unity, create a Preset asset from any texture with your desired settings, then use Project Settings > Preset Manager to assign it by folder or filename pattern. Assets/Textures/UI/ gets a UI preset (no mipmaps, point filter, RGBA32); Assets/Textures/World/ gets a world preset (mipmaps on, compressed BC7 or ASTC); Assets/Textures/Decals/ gets a decals preset.

Godot 4 has an equivalent: import preset profiles in the Import dock, with per-extension defaults. Set them once per project and you’ll avoid the drip-drip of individual artists tweaking settings that quietly inflate build size and import time.

Platform Overrides

Most engines process every texture for every supported platform, even when you’re only running the editor. This doubles or triples import time for multi-platform projects. In Unity, open any texture and check the platform tabs: if you don’t actively build for iOS, uncheck its override. Compressed texture generation for a platform you haven’t tested in months is pure waste.

For platforms you do ship to, use the most efficient compression format per platform. BC7 on desktop, ASTC on mobile, BCn on consoles. The wrong format silently doubles import time and quality degrades visibly.

Serialization Mode

Unity lets you pick between Binary and Text (Force Text) serialization for scenes and assets. Text is better for version control diffs but slower to read during import. On large projects the difference can be 20–30% of total editor import time. The usual compromise: text serialization in development branches, force binary on the final build machines. Just make sure your CI doesn’t keep switching back and forth, because every switch reimports every serialized asset.

Script-Based Import Hooks

Sometimes the default import isn’t right and no preset captures the rules you need. Write a scripted importer. Unity’s AssetPostprocessor gives you hooks to customize every import:

public class TexturePostprocessor : AssetPostprocessor {
    void OnPreprocessTexture() {
        var importer = (TextureImporter)assetImporter;

        if (assetPath.Contains("/UI/")) {
            importer.mipmapEnabled  = false;
            importer.filterMode     = FilterMode.Point;
            importer.textureType    = TextureImporterType.Sprite;
        } else if (assetPath.Contains("/Decals/")) {
            importer.wrapMode       = TextureWrapMode.Clamp;
            importer.alphaIsTransparency = true;
        }
    }
}

Scripted importers run as part of the standard pipeline and cache correctly, so the investment pays back on every future import.

Pipeline Caches

Every modern engine has some form of derived-data cache: Unity Accelerator, Unreal’s DDC, Godot’s .godot import cache. Share them. For small teams, host the cache on an internal NAS or a cheap VPS; for larger teams, spin up a dedicated service.

Our first onboarding instruction used to be “start the first import before you go get lunch — maybe two lunches.” After we set up the Accelerator, new hires were editing scenes ninety minutes after cloning the repo. The throughput boost alone justified the cost in the first week.

Version Control Hygiene

Git can secretly trigger reimports. CRLF line-ending rewrites change file hashes. LFS filter misconfigurations rewrite binary files on checkout. Git Clean or sparse-checkout interactions can delete meta files that the engine then regenerates. Set a consistent .gitattributes, use LFS for all binaries over a few MB, and audit what’s happening on branch switch by timestamping a few files before and after.

Track the Metric Over Time

Put total reimport time on a dashboard and watch it per week. Sudden jumps usually point to a new importer, a package upgrade, or a batch of wrongly-configured assets landing in a recent commit. Catching the regression on week two is easy; catching it six months later, after the cause is buried under other changes, is a project in itself.

Related Issues

For the broader view of editor iteration costs, see how to debug slow iteration time in game development. For related build practices, read best practices for error logging in game code.

Every asset you reimport that didn’t need to be reimported is a small tax on the whole team. Sweep them twice a year.