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.