最新动态
Unity技术栈核心Unity Burst | 最新Neon intrinsics 在 Unity引擎中的运用指南
2024-09-13 21:16

Burst是 Unity技术栈的核心,它既能与Unity DOTS一起生成高优化代码,又能作为单独的功能使用。最近发布的新版本 Unity Burst 1.5(点击回看)重点添加了多条 Neon intrinsics 指令。Neon intrinsics 指令支持精确设定矢量命令,为 Arm CPU 的处理进程生成最为高效代码。新指令的效果立竿见影,其中一项优化甚至能让 Burst 代码比结构精巧的非 Burst 代码快 6 倍,让手动编写的 Neon 代码快 10 倍。Neon 指令集传统上只适用于 C/C++ 语言,而 Unity 目前已成功将其移植到了 C# 中。

不过,要找到最合适的指令并没那么简单,Arm 为此特地制定了一份“Neon intrinsics 在 Unity 中的运用”指南,外加一个带有开源代码的 Unity 项目(链接见文末),供广大开发者参考。这篇指南将帮助你以正确的结构构建 Burst 代码,让代码自动应用 Neon 指令集,享受其带来的性能提升,为你省去自行编写指令集的麻烦。我们下面就来看看怎样才能充分利用起 Neon intrinsics。


Burst 编译器将自动采用 Neon intrinsics 来提高性能收益,而我们仍可以使用其它方法来进一步提高 Burst 性能。举例来说,我们可根据一定的结构来调整数据和函数循环结构,利用自动矢量化来获取大量的性能提升。

要想在 Burst 编译器中将四条指令合并为一条 Neon SIMD 指令,我们可编写简短、连贯并保留内联的函数。此外,经我们在物理碰撞模拟中测试发现,传入 Burst 函数的指针在添加 [NoAlias] 属性后,其速度可提高 4 倍。


本文中的案例重点在于物理碰撞,因此上方演示场景仅使用了简单的胶囊型和立方体图形。例中对两种类型的碰撞进行了优化:用于角色-墙体间碰撞的轴向边框盒(Axis-Aligned Bounding Boxes,AABB),及用于角色之间碰撞的截面半径碰撞。

手动编写的指令要快于编译器并不简单,但这里将介绍几种方法。性能改进不仅是个目标,也是一个过程。在进入分析优化阶段后,我们可以先分析线程的运行耗时,再进行调整,如此循环往复。我们可以使用 Profile analyzer,或自己的计时方法来完成这一阶段的优化。

这时我们需要将注意力放到代码调整上。在本例中,我们将原先的 Burst jobs 代码转写成了静态函数,方便进行计时。异步执行在最终的游戏代码中发挥了巨大作用,尽管性能计时使得代码执行更为复杂了一点。在一个真正的游戏里,你需要使用 ProfilerMarker、ProfilerRecorder 和 Profileanalyzer 来计算 job 的耗时。而此例中,改写后的 Burst 静态函数实际上强制在脚本中应用了自动矢量化结构。如果 job 使用的是由 Burst 静态函数组成的 NativeArray,则基本类型的指针使用起来也会更加简单,静态函数会把数据拆分成更易矢量化的片段。而应用在指针上的 [NoAlias] 属性会告诉编译器,指针调用的数据是否有重复。在本例中,Burst 的性能非常强大,以至于只有及其出色的 Neon 代码才能比它更快。为了充分发挥 Neon 的作用,这两种类型的碰撞都需要采用特定的数据和逻辑结构。

矢量化的效果在同时比对四个或八个对象时最好,因为这时运算可一次性完成(有正确的 Neon 指令的情况下)。本篇指南将介绍几种维持最大性能的实例。


直接运行的普通代码:

Burst静态函数调用时:

自采用Neon intrinsics指令的Burst静态功能调用时:


要想了解完整的优化过程,查看实例的实际效果,学习在自己的项目中进行应用,应用指南以及查看优化后的代码可在文末链接中查询。新指令的效果立竿见影,其中一项优化甚至能让 Burst 代码比结构精巧的非 Burst 代码快 6 倍,让手动编写的 Neon 代码快 10 倍。

有关 Neon 的详细信息,请访问 Arm Neon 开发者页面。虽然网站的大部分内容是针对 C/C++ 指令的,但同样的原则也适用于 C#。





文中提及的相关链接:

?

[1] Neon intrinsics 指令:

[2] “Neon intrinsics 在 Unity 中的运用”指南:

[3] Unity 项目(带有开源代码):

[4] Profile analyzer:

[5] Arm Neon 开发者页面:

[6] Unity 支持的 Neon intrinsics 指令列表:

    以上就是本篇文章【Unity技术栈核心Unity Burst | 最新Neon intrinsics 在 Unity引擎中的运用指南】的全部内容了,欢迎阅览 ! 文章地址:http://lianchengexpo.xrbh.cn/quote/5969.html 
     行业      资讯      企业新闻      行情      企业黄页      同类资讯      网站地图      返回首页 迅博思语资讯移动站 http://keant.xrbh.cn/ , 查看更多