Quick answer: Cache Library/BurstCache across CI runs. For long-term, replace generic Burst jobs with explicit per-type structs to limit permutations. Set Synchronous compile to false for editor iteration speed.
Cold CI takes 30 minutes; most of it Burst. Generic IJob<T> instantiations explode the work.
The Symptom
Build phase shows long “Burst compiling” output. Each cold build repeats the work; subsequent builds on the same machine are fast. Devs wait minutes after pulling the project fresh.
The Fix
Cache Library/BurstCache.
# GitHub Actions example
- uses: actions/cache@v4
with:
path: |
Library/Bee
Library/BurstCache
Library/PackageCache
Library/ScriptAssemblies
key: unity-${{ hashFiles('Packages/manifest.json') }}-${{ github.run_id }}
restore-keys: |
unity-${{ hashFiles('Packages/manifest.json') }}-
unity-
Replace generic jobs.
// Before — generic, multiplies permutations
[BurstCompile]
struct ProcessJob<T> : IJob where T : struct, IComponent { ... }
// After — concrete, one permutation each
[BurstCompile] struct ProcessHealthJob : IJob { ... }
[BurstCompile] struct ProcessPositionJob : IJob { ... }
Boilerplate, but Burst compiles each only once.
Async Editor Compile
Project Settings → Burst → Compilation = Asynchronous. Editor doesn’t block while compiling; jobs fall back to Mono until Burst is ready. Faster iteration; first runs slow until cache warms.
Verifying
Time the build phase. Cold (no cache) vs warm (cached) should differ dramatically. Cache hit logs in CI confirm restore.
“Cache the BurstCache. Skip generics in hot paths. Async compile in editor.”
Related Issues
For Burst AOT cross-platform, see AOT. For Burst BC1006, see BC1006.
Cache. Concrete jobs. Async. Builds shrink.