Windows 10,ARM64和虚幻引擎?集中在同一台笔记本电脑上?有可能吗?
很快会的。在此博客中,我将展示如何开始将UE4游戏和图形移植到ARM上的Windows 10,以便为目标版本的虚幻引擎做准备。
这应该没什么意外的。自Visual Studio 15.9起,微软已提供用于ARM64的Visual C ++编译器和库。宏碁,惠普,联想,微软和三星等OEM厂商已经在由高通Snapdragon™计算平台支持的ARM设备上销售Windows 10。
但是,可能让你感到惊讶的是,ARM 10不仅适用于文字处理,Web浏览和检查电子邮件,而且还适用于很多其他方面。Miguel Nunes在Snapdragon 8cx上的Windows上演示了Zoom,其电池寿命比x86驱动的笔记本电脑长3倍。Windows on ARM对Surface Pro X上的x64应用程序的支持也在这里。
当你开始将UE游戏移植到ARM64并在由Snapdragon计算平台提供支持的笔记本电脑上运行它们时,将看到更出色的性能。
但是,也许最大的惊喜是你不必在仿真环境中运行。
锦上添花:虚幻引擎的本机ARM64支持即将到来
ARM上的Windows 10通过仿真支持x86(32位)和x64(64位)应用,这为您提供了一种快速部署方法。重新编译为本地ARM64应用,程序会得到更快的处理,更高效的功耗以及Snapdragon计算平台和高通Adreno™GPU的所有优势。
这就是为什么我们聘请ForwardXP创建ARM64版本的古老Infiltrator Demo作为概念验证的原因。尽管此演示已经有好几年的历史了,但它的创建目的是为了展示带有高端内容的虚幻引擎4的功能。直到今天,该演示仍需要高端离散PC GPU来获得可靠的实时性能。
我们全力以赴,并决定优化演示本身而不是核心引擎的内容。为什么?因为它更好地代表了您将游戏移植到ARM64以及扩展各种硬件的性能所需要的过程。
除了优化演示内容外,该项目还需要进行开发工作才能将Windows 10 ARM64支持添加到Unreal Engine 4.23中。有关在ARM64上针对Windows的Unreal Engine的更多信息,请访问我们的游戏开发人员指南中的Windows在Arm64上的Unreal Engine教程。
更改UE以支持Snapdragon
虚幻引擎4使用一个用C#编写的自定义构建系统,称为虚幻构建工具(UBT)。为了向Windows平台添加ARM64体系结构支持,源代码中的大部分更改都是对UBT的更新。
UE4已经支持Microsoft的基于ARM的HoloLens。虽然UBT将其作为自己的平台进行管理,但它与Windows平台版本非常相似。结果,可以将构建系统逻辑修改为支持Windows的ARM64。
现有的Hololens和Android支持允许大多数C ++代码针对ARM64进行编译,而无需进行重大更改。该代码库已经支持NEON SIMD内部函数。
线程关联配置
ARM big.LITTLE体系结构要求仔细设置线程关联性,以最大程度地利用高性能的Gold核(Silver核编号为0到3,Gold核编号为4到7):
· 主游戏线程和渲染线程被配置为仅在Gold内核上运行。
· 可以在任何内核(包括Silver内核)上调度音频线程和工作线程池。
该演示使用UE4 DirectX 12渲染硬件接口(RHI)。这是通过在命令行选项中传递-d3d12来控制的,也可以在项目的.ini设置中对其进行配置。
-prime_render命令行选项
ARM64配置还支持新的命令行选项:-prime_render
· 渲染线程:负责场景图的设置和遍历以及大部分引擎工作。
· RHI线程:使用DirectX 12 API管理渲染命令流的提交。
-prime_render仅将“渲染线程”锁定到内核6,将“ RHI线程”专门锁定到内核7。这会使游戏线程在内核4和5之间浮动。如果未使用该命令行选项,或者DirectX 11 RHI如果处于活动状态,则根据Windows调度程序启发式方法,此处提到的线程都在四个Gold核心之间浮动。
在Infiltrator演示中使用-prime_render选项可以提供更好的性能和更流畅的FPS。但是请注意,此命令行参数可能不适用于与GPU绑定的演示情况(如Infiltrator)。具有较少渲染工作和更多游戏线程负载的游戏项目可能无法从此设置中受益。
NEON内置函数
在Visual Studio中,可通过arm64_neon.h获得ARM64 NEON内部函数。有关不同体系结构中可用内在函数的比较,请参见编译器内置函数。
UE4使用NEON SIMD内部函数来实现跨引擎使用的Vector *功能。这是在UnrealMathNeon.h中实现的(有关x86_64体系结构上的SSE / SSE4等效信息,请参见UnrealMathSSE.h)。
但是,UE4中还有另一系列的功能具有SSE实现,但目前没有等效的NEON。这些由UnrealMathSSE.h,UnrealPlatformMathSSE.h和UnrealPlatformMathSSE4.h提供。这些功能是以下系列:
· {Trunc,Floor,Round,Ceil} To {Float,Double}
· {Trunc,Floor,Round,Ceil} ToInt
· FMath :: InvSqrt,FMath :: InvSqrtEst
FMath :: InvSqrt用于向量和矩阵代码。四元数实现使用VectorReciprocalSqrt; 存在用于使用FMath :: InvSqrt的四元数计算的代码路径,但在ARM64上不使用。
在Infiltrator演示上进行工作时,性能配置文件中未标记缺少NEON实现的功能。CPU扩展案例可能会从进一步的工作中获得一些次要的好处,以扩大引擎中NEON内部函数的使用。
Windows 10 ARM64上的XAudio API
Windows x86_64上的UE4使用XAudio 2.7。此较旧的XAudio API用于向后兼容(UE4可对较旧的Windows SDK进行编译,并支持Windows 7)。
ARM64上的Windows 10仅提供更新的XAudio 2.9。这不会更改或限制功能,但是修改了构建系统和音频模块代码以针对较新的版本进行初始化。
嫌长可不看:将渲染网格从1960次降到1210次
这是我们对Infiltrator演示内容进行的优化:
粒子效果
全面减少了颗粒。优先放置最靠近电影摄影机的粒子效果(将其减少最少),并随着与摄影机距离的增加而变得越来越具有侵略性。在将长施工皮带平移到远处时,这尤其必要。
出于以下原因之一,大多数粒子发射器已完全停用并被关闭:
· 它们的视觉效果非常微妙,或者在某些情况下由于与相机之间的距离根本无法察觉。这些包括水滴,轻度电晕,蒸汽或蒸气。
· 它们的成本简直太高了,并且用更少的有源发射器就可以获得类似的效果。这主要适用于重叠的蒸汽发射器,这极大地影响了着色器的复杂性和绘制调用。
保持活动状态的发射器会对场景产生明显的,易于看到的影响,例如发出的火花。但是,即使是这些发射器,它们的生成数量也减少了,并且它们的一些次要效果(如微弱的烟雾)也被停用了。
滚动透明材料
由于透明度和重叠平面显着增加了开销和绘图调用,因此我们删除了许多使用滚动透明材料的平面,尤其是在那些平面创建重叠层的地方。这对雾和蒸汽的影响最大。
场景中几乎每个网格都经过优化以减少多边形数量。在许多情况下,我们将网格的簇合并在一起成为单个网格,以减少绘制调用。
为了提高性能并减少内存占用,我们使用Simplygon合并和优化网格并合并多种材料。
下图所示的网格共有31,569个三角形和19,910个顶点。它们都是多次实例化的单个设备的一部分,在Infiltrator演示开始时摄像机平移时,可以在主走廊的侧面短暂看到它们。
合并和优化的网格
下图显示了合并并缩小上面的网格后生成的单个网格。
单个网格
在不影响场景质量的情况下,我们将三角形的数量减少到13,876个,并将顶点的数量减少到13,387个,分别减少了17,693个三角形(56%)和6,523个顶点(32.76%)。
这些节省在关卡中的数十个单独的网格形成滚雪球的效果,获得了最大的性能提升。
灯光
场景中的所有灯光都从“动态”更改为“静态”。
纹理大小
减小了所有纹理大小,以平衡性能与图像质量。
渲染质量
渲染质量的设置如下:
环境 | 原来的 | 针对ARM64进行了优化 |
视距 | 史诗 | 远的 |
抗锯齿 | 史诗 | 中等的 |
后期处理 | 史诗 | 中等的 |
暗影 | 史诗 | 中等的 |
贴图 | 史诗 | 高的 |
特效 | 史诗 | 中等的 |
叶子 | 史诗 | 低的 |
在这些设置中,降低“阴影”和“抗锯齿”的质量可最大程度地提高性能。另请注意,场景总体上是黑暗的,因此更改不会显着影响视觉质量。
遥远的物体
为了优化在距相机更远的距离处出现的对象,移除了法线贴图,并且更加积极地简化了网格并进行了合并(在某些情况下,部分被剔除)。这些优化对于沿着核心走廊的施工走廊建立长镜头至关重要。
结果
实施上述所有优化之后,按选定顺序进行的绘制调用次数从1960减少到1210。场景的热图显示了中心处的一个剩余热点,该点在相机内未显示。
开始使用
这些是我们应用于演示内容的优化。现在,你可以开始针对Snapdragon上的Windows优化自己的内容。我认为你会发现上述提示很有用,特别是如果你习惯于为PC或控制台开发独立显卡和RAM。
现在轮到你了。现在,你可以-是的,现在-在ARM上使用Visual Studio在Snapdragon驱动的设备上构建和运行高端GPU密集型图形。看看我们的游戏开发人员指南,该指南适用于Windows on ARM64。你可以构建面向ARM64的UBT,然后使用Windows上的Visual Studio编译自己的UE游戏。
让我们知道将你的游戏添加到Snapdragon上的Windows中还需要什么。
