Burst编译器是Unity为高性能计算场景(特别是配合C# Job System和ECS)设计的专用编译器,它基于LLVM技术,能将符合其安全约束的C#代码直接编译成高度优化、甚至能自动向量化(SIMD)的原生机器码,从而让这部分代码运行效率接近手写汇编语言。

当然,这里还要说一下:Burst只支持脚本后端为IL2CPP。
在Unity开发流程中,它作用于特定的性能关键代码 (用[BurstCompile]标记):在项目构建时或编辑器播放模式下,Burst会拦截这些代码的中间语言(IL),绕过传统的Mono或IL2CPP编译路径,直接生成极致优化的原生代码块。因此,它并非取代默认的脚本后端,而是作为其性能增强插件,专门用于加速游戏中的数学计算、物理、网格处理等密集型任务,是Unity数据导向技术栈(DOTS)实现极致运行时性能的核心工具。
cs
using Unity.Burst;
using Unity.Collections;
using Unity.Jobs;
using UnityEngine;
public class BurstExample : MonoBehaviour
{
[BurstCompile] // 关键:标记为可由 Burst 编译
struct CalculateSquaresJob : IJobParallelFor
{
[ReadOnly] public NativeArray<float> InputArray; // 输入数据
[WriteOnly] public NativeArray<float> OutputArray; // 输出数据
// 每个工作项执行的逻辑
public void Execute(int index)
{
// Burst 能对此类数学运算进行极致优化
float value = InputArray[index];
OutputArray[index] = value * value; // 计算平方
}
}
void Start()
{
const int arraySize = 1000000;
// 1. 创建 NativeArray(Burst 使用的高性能非托管容器)
var inputArray = new NativeArray<float>(arraySize, Allocator.TempJob);
var outputArray = new NativeArray<float>(arraySize, Allocator.TempJob);
// 2. 初始化输入数据
for (int i = 0; i < arraySize; i++)
{
inputArray[i] = i;
}
// 3. 创建并配置 Job
var job = new CalculateSquaresJob
{
InputArray = inputArray,
OutputArray = outputArray
};
// 4. 调度 Job 并行执行
// 每个内部循环迭代 64 次,自动分割到多个线程
JobHandle handle = job.Schedule(arraySize, 64);
// 5. 等待 Job 完成
handle.Complete();
// 6. 验证结果(可选)
Debug.Log($"示例结果: 5的平方 = {outputArray[5]}");
// 7. 必须手动释放 NativeArray
inputArray.Dispose();
outputArray.Dispose();
}
}
关键使用要点:
-
标记
[BurstCompile]属性:这是启用 Burst 编译的关键 -
使用
NativeArray而非普通数组:Burst 需要操作非托管内存 -
通过
IJob或IJobParallelFor接口:Burst 主要优化 Job 代码 -
调用
Job.Schedule()和Complete():启动并行计算 -
内存管理 :必须手动释放
NativeArray(通过Dispose())
能被Burst编译器编译的代码必须遵循严格的"安全子集"限制,其核心是仅能使用非托管类型 (如基本数值类型、结构体、Unity.Mathematics中的类型),完全禁止使用托管堆上的类对象、字符串操作以及任何可能引发垃圾回收(GC)的构造 。同时,Burst会移除所有.NET运行时的安全检查 ,包括数组边界检查和空引用检查,这意味着开发者必须自行保证内存访问安全。此外,它不支持异常处理、虚函数/接口调用、反射以及递归。
显然,这些严格的限制是为了换取更极致的性能,接下来我们来聊聊为什么Burst编译器针对高频计算场景有如此优秀的性能。
Burst 编译器在碰撞检测等高频计算上具有压倒性优势,其核心源于三个层面的深度优化:基于 LLVM 的极限静态优化 、对 SIMD 指令的自动向量化 ,以及与 Unity 数据结构的无缝适配。
Burst 的核心引擎是业界顶尖的 LLVM 编译器框架。它会在编译时(而非运行时)对你的代码进行一场极其激进的"手术":将小函数全部内联展开、预计算所有能确定的常量、重新组织循环与内存访问顺序,并生成高度优化的底层指令。这就像为一段复杂的旅程提前规划好每一条最优路径、排除所有红绿灯和岔路,确保 CPU 在执行时没有任何犹豫和浪费,纯粹以最高效率运行计算逻辑。
对 SIMD 指令的自动向量化是 Burst 性能飞跃的关键。它能自动分析你的循环和数学运算,将原本一次只能处理一个数据的标量操作(如分别计算4个距离),智能地"打包"成一条 SIMD 指令(如一次性计算4个距离)。对于碰撞检测中充斥的向量点乘、矩阵变换等操作,这相当于将单车道拓宽为四车道或八车道,让 CPU 的硬件计算单元一次性满载,理论吞吐量直接提升数倍,完美契合了高频计算的数据并行特性。
Burst 并非独立工作,它与 Unity 的底层数据体系(如 NativeArray、Unity.Mathematics)是共同设计的。这些数据结构在内存中始终保持紧凑、对齐的布局,恰好符合 SIMD 指令高效加载数据的要求。同时,math库中的函数(如 dot, cross)会直接映射为最优的硬件指令。这种深度集成消除了数据转换和访问的开销,确保了从高级代码到机器指令的流水线处于"零摩擦"状态,让优化潜力完全释放。
