Quick answer: Unity InstantiateAsync hitching despite the “async” name? The first instantiate has to compile shader variants on the main thread — pre-warm them, or use Addressables async load + Instantiate.

Spawning 50 enemies via InstantiateAsync still hitches the first time. Shaders, materials, and scripting domain init aren’t async-friendly.

First-Time Cost

The first instantiate of a prefab compiles its shaders, JITs Burst jobs, and initializes domain. None of that runs off the main thread — subsequent instantiates are fast.

Pre-Warm Shaders

At load, queue a ShaderVariantCollection.WarmUp() for the prefab’s shaders. Or instantiate one off-screen to force compilation, then destroy.

Addressables Path

var handle = Addressables.InstantiateAsync(key);
handle.Completed += op => { ... };

Addressables loads the bundle asynchronously and warms its shaders before instantiation completes.

Spread Spawn Across Frames

For batches, coroutine through instantiation — one or two per frame — rather than firing 50 in one tick.

Verifying

Profile a spawn burst — first frame cost matches subsequent ones; no shader compile spikes.

“Async instantiate still pays first-use costs on the main thread. Pre-warm to spread them.”

Pre-warming during a loading screen is invisible to players; first hitches in gameplay are not. Spend the loading time well.