Burst 编译器的最新技术可以帮助Unity 开发者们利用起Arm Neon 指令集,在安卓设备上,Arm 架构下的Unity 项目可借助Burst 编译器提高性能。

Unity 与Arm 在此前确立了合作伙伴关系,致力于提升安卓生态中数十亿由Arm 驱动的移动设备的游戏开发体验。

对于游戏开发者来说,性能就是一切。Arm 年复一年地改进CPU 与GPU 技术,为打造丰富体验而不断提高设备性能。最近,Arm发布了两款新产品:大幅提升了性能的Cortex-A78 以及Cortex-X1。这两种全新的硬件则由新的Arm 架构编译器技术——Burst 来补足。在开发游戏时,Burst 编译器会将游戏优化后转译为高效的二进制文件,让游戏能最大限度地利用起Arm 架构的性能。

Burst 介绍

Burst 是一种超前的编译器技术,使用数据科技栈(DOTS)和Job System制作的Unity 项目可借助Burst 技术提高运行性能。Burst 通过被称为“高性能C#(HPC#)”的子语言集完成编译,通过应用LLVM 编译器框架下的高级优化方法来实现设备能源的高效利用。

Burst 可以帮助APP利用并行机制。它使用起来是否简单,可以为CPU算法带去大量的性能增益。在下方视频中,你将看到启用Burst和未启用Burst两个demo环境的直接对比。



unity发布arm架构linux程序 unity arm_unity发布arm架构linux程序

可以看到Burst 编译的代码可以在帧上计算更多的物理元素,让性能更高、硬件发热更少、能耗更低,可展现的内容也更吸引人。

Burst 原理介绍

Burst 在默认条件下就能带来更多性能增益,这是什么原理呢?

Burst 可将HPC# 转译成LLVM IR,一种LLVM 编译器框架使用的媒介语言,从而完全利用起LLVM 在Arm 架构下的代码生成功能,将程序的数据流转换成优化后的高效机器码。

下方图表展示了该流程。



unity发布arm架构linux程序 unity arm_matlab2019 编译器_02


Burst 可以显示出HPC# 和DOTS 框架中的数组混叠限制,利用起LLVM 对硬件架构的了解, 这使Burst 可以根据针对Unity API 编写脚本的属性,进行有针对性的转换。

如何编写Burst 程序

Burst 可以编译使用了DOTS Jobs System 的C# 脚本。使用时,只需在Job 定义前添加一个[BurstCompile]属性:

[BurstCompile]struct MyJob : IJob{  public NativeArray Input;  public NativeArray Output;  public void Execute()  {  for (int I = 0; I < Input.Length; i++)  {    Output[i] = Input[i] * Input[i];  }  }}
[BurstCompile]
struct MyJob : IJob
{
  public NativeArray Input;
  public NativeArray Output;
  public void Execute()
  {
  for (int I = 0; I < Input.Length; i++)
  {
    Output[i] = Input[i] * Input[i];
  }
  }
}


右滑查看完整代码 在Jobs 菜单中的Busrt Inpsctor 内,我们可以看到生成的代码。注意,下方演示禁用了安全限制(Safety Checks),Burst 版本为1.3.3。

unity发布arm架构linux程序 unity arm_LLVM_03


在弹出的Burst Inspector 中,我们勾选了目标架构为ARMV8A_AARCH64,启用了Armv8-A 的代码生成功能。

unity发布arm架构linux程序 unity arm_编译器_04


接着就能看到为C# 循环、及使用Neon 指令集的循环生成的AArch64 代码了。

unity发布arm架构linux程序 unity arm_指令集_05


要想进一步了解如何使用Burst 编译器,请参阅指令说明手册。