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.