Unity Burst是基于LLVM的高性能编译器,可将C#子集(HPC#)编译为高度优化的原生机器码,常与Job System搭配,大幅提升CPU密集型代码(如物理、粒子、AI计算)的运行效率,是DOTS技术栈的核心组件。以下是详细介绍:


核心原理与编译模式

  • 底层架构:以LLVM为后端,将C# IL转换为优化的原生指令,支持SIMD、循环展开、常量传播等深度优化,减少托管层开销。
  • 编译模式
    模式 适用场景 特点
    JIT 编辑器Play模式 异步编译,首次运行用默认Mono JIT,编译完成后切换至Burst优化代码
    AOT 打包发布 构建时预编译所有支持代码,需对应平台链接工具(类似IL2CPP)

关键特性与使用限制

  1. 核心特性

    • [BurstCompile]特性:标记Job结构体或静态方法,指定代码参与Burst编译。
    • HPC#子集:仅支持值类型(结构体、基元类型)、Unity.Mathematics类型,禁用托管对象、try-catch、字符串等,避免GC与托管开销。
    • SIMD加速:自动向量化循环,配合Unity.Mathematics的float3/float4等类型,提升数学运算吞吐量。
    • 安全检查与快速数学:编辑器可启用安全检查(容器越界、线程冲突);发布时可开启快速数学(牺牲部分精度换取速度)。
  2. 使用限制

    • 不支持托管数组(int[]),需用NativeArray;不支持LINQ、委托、迭代器等复杂语法。
    • 方法内不能引用托管对象(如List),需使用Unity.Collections中的原生容器。

典型用法示例

using Unity.Burst;
using Unity.Jobs;
using Unity.Collections;
using Unity.Mathematics;

[BurstCompile] // 标记为Burst编译
public struct ParallelSumJob : IJobParallelFor
{
    [ReadOnly] public NativeArray<float> data;
    [WriteOnly] public NativeArray<float> result;

    public void Execute(int index)
    {
        result[0] += data[index] * data[index]; // 平方和计算,自动SIMD优化
    }
}

// 调用示例
public class BurstExample : MonoBehaviour
{
    void Start()
    {
        var data = new NativeArray<float>(1000000, Allocator.TempJob);
        var result = new NativeArray<float>(1, Allocator.TempJob);

        // 填充数据...

        var job = new ParallelSumJob { data = data, result = result };
        job.Schedule(data.Length, 64).Complete(); // 并行调度64个批次

        Debug.Log($"Sum of squares: {result[0]}");

        data.Dispose();
        result.Dispose();
    }
}

适用场景与优化建议

  1. 最佳适用场景

    • 大规模数据处理(粒子系统、网格变形、寻路网格计算)。
    • 物理引擎扩展(自定义碰撞检测、力场计算)。
    • 并行Job任务(IJobParallelFor、IJobForEach),充分利用多核CPU。
  2. 优化建议

    • 优先使用NativeArray/NativeList等原生容器,避免托管内存分配。
    • 用Unity.Mathematics替代Mathf/Vector3,最大化SIMD收益。
    • 控制Job粒度,避免过细任务导致调度开销;利用Burst Inspector查看优化诊断信息。

与Job System的协同

Burst与Job System深度绑定,Job负责拆分并行任务,Burst负责编译优化任务代码,两者结合可将CPU密集型逻辑的性能提升数倍至数十倍,尤其适合需要大量并行计算的3D游戏、模拟类应用。


总结

Burst通过LLVM优化与HPC#约束,为Unity提供接近原生C++的代码性能,是解决CPU瓶颈的关键工具。使用时需遵循其类型与语法限制,结合Job System与原生容器,才能最大化性能收益。