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环境的直接对比。
可以看到Burst 编译的代码可以在帧上计算更多的物理元素,让性能更高、硬件发热更少、能耗更低,可展现的内容也更吸引人。
Burst 原理介绍
Burst 在默认条件下就能带来更多性能增益,这是什么原理呢?
Burst 可将HPC# 转译成LLVM IR,一种LLVM 编译器框架使用的媒介语言,从而完全利用起LLVM 在Arm 架构下的代码生成功能,将程序的数据流转换成优化后的高效机器码。
下方图表展示了该流程。
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。
在弹出的Burst Inspector 中,我们勾选了目标架构为ARMV8A_AARCH64,启用了Armv8-A 的代码生成功能。
接着就能看到为C# 循环、及使用Neon 指令集的循环生成的AArch64 代码了。
要想进一步了解如何使用Burst 编译器,请参阅指令说明手册。