基于Amazon Graviton4运行游戏引擎,显著提升性能

576664e165320c86ef780ffb7185fada.gif

Unreal Engine

Amazon Graviton介绍

虚幻引擎(Unreal Engine,简称UE)是先进的开源实时3D创作工具之一,为大型游戏提供动力,也被各行各业的创作者所使用。

Amazon Graviton是亚马逊云科技推出的基于ARM的自研CPU处理器。与X86-64的CPU相比,Amazon Graviton的CPU能耗更低、CPU时钟频率更稳定,同时避免了SMT切换的开销。2018年亚马逊云科技发布了第一款Amazon Graviton实例Amazon EC2 A1,这是第一款主流云厂商大规模部署的ARM实例。在之后的2020年和2022年,亚马逊云科技陆续发布了Amazon Graviton2和Amazon Graviton3的实例Amazon EC2 M6g和Amazon EC2 C7g,性价比逐步提升(相较于6系的X86实例分别提升40%和65%)。

而在今年发布的新的Amazon Graviton4实例,则是迄今为止亚马逊云科技为各种工作规模(Workload) 设计的极其强大并且高效节能的CPU。Amazon Graviton4的实例Amazon EC2 R8g相较于Amazon Graviton3的实例Amazon EC2 R7g有大约30%的性能提升。早在2023年Amazon re:Invent上,Amazon EC2 R8g实例刚刚发布预览版本(Preview) 的时候,就有超过100家客户将他们的Workload部署在Amazon EC2 R8g上进行测试,并且获得了显著的性能提升,其中就包括Epic Games。

Epic Games早在2021年就在他们的游戏《堡垒之夜》中大规模使用Amazon Graviton的案例,在他们的测试中显示,即使是延迟要求最高的那一类游戏,Amazon Graviton3的实例Amazon EC2 C7g也非常适合,并且还有显著的性价比提升。而在新的Amazon Graviton4实例的测试中,他们发现性能相较于Amazon Graviton3更强。目前Epic Games已使用了上万Amazon Graviton的芯片来承载他们的游戏业务,Amazon Graviton给Epic Games带来的价值不仅限于《堡垒之夜》这一款游戏,还包含了所有用Unreal Engine构建Dedicated Server的游戏。

案例

https://aws.amazon.com/cn/solutions/case-studies/innovators/epic-games/

UE Engine从4.27版本开始已经支持ARM架构的Dedicated Server,使开发者可以很容易地将Dedicated Server代码重新编译为ARM64的二进制文件。这篇文章将向你展示如何将UE5 Lyra Sample Game在亚马逊云科技新的搭载了Amazon Graviton4芯片的ARM架构实例Amazon EC2 R8g上运行。

UE5 Lyra Sample Game

https://dev.epicgames.com/documentation/en-us/unreal-engine/lyra-sample-game-in-unreal-engine

部署步骤

环境准备

  • 申请访问Unreal Engine源码并下载,请参考下方链接。本文使用5.4.3版本源码;

  • 启动g4dn.16xlarge实例,选择系统环境AMI:Microsoft Windows Server 2022 Base;

  • 安装Visual Studio Community 2022,请参考下方文档说明,选择安装的组件包和推荐设置;

  • 因为需要在Windows上编译Linux ARM64的Dedicated Server,需要安装交叉编译工具链,5.4.3版本对应v22版本,下载链接参考下方;

  • 安装NVIDIA GPU驱动,这里选择安装Gaming驱动

  • 从下列链接进入,下载并安装Direct X

Unreal Engine源码

https://www.unrealengine.com/en-US/ue-on-github

Visual Studio Community 

https://visualstudio.microsoft.com/downloads/

参考文档

https://dev.epicgames.com/documentation/en-us/unreal-engine/setting-up-visual-studio-development-environment-for-cplusplus-projects-in-unreal-engine?application_version=5.4

下载链接

https://cdn.unrealengine.com/CrossToolchain_Linux/v22_clang-16.0.6-centos7.exe

安装Gaming驱动

https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/install-nvidia-driver.html#nvidia-gaming-driver

安装Direct X

https://www.microsoft.com/en-us/download/details.aspx?id=35&msockid=31eed1e2d74d6b343f89c526d6846a99

源码编译UE5 Engine Editor

1.UE5引擎源码解压到C:\UnrealEngine ,注意目录太长会出错。另外需要特别注意,如果是使用Windows自带的解压缩工具,需要先选中文件点击鼠标右键,选择“属性”,点击unlock,这样才可以正确解压所有文件;

2.参考下方安装指导,完成设置;

3.执行C:\UnrealEngine\Setup.bat,会自动安装UE5需要的相关环境;

4.注意里面用到的.net 3.5 framework在Windows Server中无法直接安装,需要在Server manager里通过Add Roles and Features Wizard进行安装;

5.执行C:\UnrealEngine\GenerateProjectFiles.bat,这一步会生成VS2022要用到的.sln文件,UE5.sln;

6.如果提示找不到相关包,考虑增加在线源,参考:

  • 打开Visual Studio 2022,选择Continue Without Code。

  • 打开菜单Tools > Options > NuGet Package Manager > Package Sources。

  • 会看到只有一个名为 “Microsoft Visual Studio Offline Packages” 的源,点击 “+” 按钮增加一个源。

  • Name可以随意输入,源地址使用 “https://api.nuget.org/v3/index.json”。

  • 点击 “Update” 并选中新的源。

  • 重新运行GenerateProjectFiles.bat。

7.双击打开新生成的UE5.sln,设置solution configuration为Development Editor,设置solution platform为Win64;

8.右侧Solution Explorer,在Engine->UE5点击右键,选择Build启动UE5 Editor编译,该步骤需要比较长的时间;

9.编译完成后会生成一个Win64的UE5 Engine Editor在C:\UnrealEngine\Engine\Binaries\Win64\UnrealEditor.exe;

10.至此,已经成功在Windows上编译安装了UE5 Engine Editor。

安装指导

https://github.com/EpicGames/UnrealEngine

使用UE5 Engine Editor创建游戏项目

Epic官方提供了一款多人演示游戏Lyra Sample Game project,其中包括客户端、服务器、资产文件和代码。可以使用这个项目来进行测试。

1.下载Lyra Sample Game。

从Epic游戏商城下载免费的Demo项目Lyra Sample Game,要下载该项目,运行Windows开始菜单中的“Epic Games Launcher”,从左侧窗格中选择Unreal Engine,导航到商店的Unreal Engine部分,选择Samples页面中的Lyra Starter Game。

选择Create Project。

然后选择Unreal Engine version 5.4并创建。

3b2f3210d2692dbdcfb59bf1ade3aa58.jpeg

项目已经在我的文档\Unreal Projects中生成,构建和打包游戏的第一步是为Lyra生成Visual Studio项目文件。打开游戏项目的目录。选择LyraStarterGame.uproject文件并鼠标选择 “Generate Visual Studio project files”,可以生成LyraStarterGame.sln项目文件。

eb0f3d229d794fe9e4aa398827efb2c0.jpeg

2.调整工程参数。

打开LyraStarterGame.uproject文件,在Unreal Editor中打开Lyra。在为Lyra构建Dedicated Server和客户端版本之前,需要调整以下几点:

将服务器默认地图设置为L_Expanse,打开菜单栏“Edit”->“Project Settings”。

6439d79535820e9a0665220dc58d9b8f.jpeg

选择 “Maps & Modes”,打开 “Default Maps” 下的 “Advanced” 部分,将Server Default Map设置为L_Expanse。完成此操作后,您可以关闭 “Project Settings” 窗口。

e073230745ff61f3a1cb97b2821c3b44.jpeg

还需要更改默认生成的机器人数量,这样它们就不会在连接到服务器后立即开始攻击客户端。机器人更改还将使您可以更轻松地查看客户端何时连接或断开与服务器的连接。后续可以随时对这些值进行修改。为此,请选择编辑器屏幕左下角的“Content Drawer”。

ccf1151038db16eca9a5c82a2ba06d55.jpeg

选择目录“Plugins”,然后搜索B_ShooterBotSpawner并选择出现的B_ShooterBotSpawner Blueprint Class,双击打开设置面板。

9dadf96f4823a0fad9a741a90c0bd26b.jpeg

在Gameplay章节中,修改Num Bots to Create为0,点击左上角的“Compile”进行编译。

085f57d490caf031edd5144854a3f2cc.jpeg

3.进行编译。

关闭Unreal Editor并打开LyraStarterGame.sln。

确认项目的源目录中有LyraServer.target.cs文件。如果没有,则需要创建一个,然后打开该文件。从 “Solution Configuration” 工具栏中选择 “Development Server”。

ed2ed425abc14c7b5875ba1c0a08264c.jpeg

选择菜单中的“Build”->“Build Solution”。

05b236be58fdd95f500437008b6dc95e.jpeg

完成后,将 “Solution Configuration” 工具栏中的选择更改为 “DevelopmentClient”,再次选择菜单中的“Build”->“Build Solution”来重复生成步骤。

4.内容烘焙。

将内容从内部格式转换为特定于平台格式的过程称为烘焙。在玩游戏之前,你需要进行内容烘培。为此,请在虚幻引擎编辑器中重新打开LyraStarterGame项目。选择“platforms”下拉列表,选择Windows,确认“Binary Configuration”设置为 “Development”,确认“Build Target”设置为“LyraServer”,然后选择“Cook Content”。

过程完成后,可以在项目的二进制文件目录中找到服务器二进制文件:Documents/Unreal Projects/LyraStarterGame/Binaries/Win64/LyraServer.exe。

f4a3f52db4fa959bacce21f19720ded7.jpeg

类似地,还需要烘培客户端的内容。为此,请将编译目标更改为LyraClient,然后再次选择“Cook Content”。

ff27677af3d6976913d4c064ce601857.jpeg

5.本地测试。

这时可以启动服务器和客户端进行测试了,要启动服务器程序,需要打开一个PowerShell窗口,进入对应目录,然后执行以下命令:

.\Binaries\Win64\LyraServer.exe -log -port 7777

可以看到专用服务器已经启动,并可以看到日志输出:

b5e62ec87f21a5ddeb75b0434fb0fb04.jpeg

启动另一个Powershell窗口并运行以下命令以启动游戏客户端并将其连接到服务器:

.\Binaries\Win64\LyraClient.exe 127.0.0.1:7777 -WINDOWED -ResX=800 -ResY=450

可以看到类似以下的游戏画面:

423c8014757f1f1d3ce4b8c440076088.jpeg

6.为Amazon Graviton实例构建和打包Dedicated Server。

现在,已经验证了游戏和Dedicated Server均正常运行,可以为Amazon Graviton EC2实例构建和打包Dedicated Server。为此,请返回虚幻引擎编辑器。在“platforms” 下拉列表选择LinuxArm64。确认“Binary Configuration”设置为“Development”,“Build Target”设置为“LyraServer”,然后选择“Cook Content”。

dee6468564897993b6b78e4e67386641.jpeg

由于后面将在不同的主机和操作系统上运行服务器,因此还需要打包内容。为此,需要在“platforms”中选择“LinuxArm64”,然后选择“Package Project”。在弹出的文件资源管理器窗口中选择输出二进制文件的目录,将会在你选择的文件夹中创建一个名为LinuxArm64Server的目录,压缩这些文件并拷贝到Linux机器上安装运行。

6f601da4a9cbba51bfdaea0d8a636fb6.jpeg

在Amazon Graviton服务器上安装Dedicated Server

在Amazon EC2控制台中启动Amazon Graviton实例进行测试,可以选择不同的 Amazon Graviton实例进行测试,这里选择新的Amazon Graviton4代实例Amazon EC2 R8g进行测试,操作系统使用标准的Amazon Linux 2023 AMI

安全组设置中,注意放开UDP 7777端口,为游戏服务器通信端口。也可以放开TCP 22端口方便SSH连接或者使用Session Manager连接实例,使用“unzip ./LinuxAArch64Server.zip”解压刚才打包好的服务器程序,并进入目录LinuxArm64Server/。

允许脚本执行权限,并执行该脚本:chmod +x LyraServer-Arm64.sh && ./LyraServer-Arm64.sh。

至此,Linux服务器已经成功运行,客户端指定服务器IP进行连接即可。

.\Binares\Win64\LyraClient.exe <服务器ip>:7777。

进阶编译优化

对于一些针对最新芯片和指令集的优化,可以进行编译参数的设置进行深度优化,参考Graviton的编译优化建议,可以从以下几个C/C++编译参数入手:

  • -mcpu=neoverse-v2

该参数用于指定CPU型号,neoverse-v2是 Amazon Graviton4的参数,Amazon Graviton3使用neoverse-v1。

请修改Unreal Engine的源码,在C:\UnrealEngine\Engine\Source\Programs\UnrealBuildTool\Platform\Linux\LinuxToolChain.cs:344加入:

if (Architecture == UnrealArch.Arm64)
            {
                Arguments.Add("-mcpu=neoverse-v2");
            }

左右滑动查看完整示意

重新打开UE5 Engine Editor的UE5.sln,右侧Solution Explorer,在Engine->UE5点击右键,选择Build,编译出新版的UE5 Editor。

  • -flto

LTO(Link Time Optimization)链接时优化是链接期间的程序优化,多个中间文件通过链接器合并在一起,并将它们组合为一个程序,缩减代码体积,因此链接时优化是对整个程序的分析和跨模块的优化。

该参数在UnrealEngine\Engine\Source\Programs\UnrealBuildTool\Platform\Linux\LinuxToolChain.cs:338中的默认GetCompileArguments_Optimizations参数中,有调用AddCompilerLTOFlags(Arguments加入,因此无需额外调整。

  • -Os

该参数专门优化目标文件大小,执行所有的不增加目标文件大小的-O2优化选项。同时-Os还会执行更加优化程序空间的选项。

该参数在UnrealEngine\Engine\Source\Programs\UnrealBuildTool\Platform\Linux\LinuxToolChain.cs:417行中,判断OptimizationMode.SizeAndSpeed时会使用,因此可以在打包服务器程序时,从“Development” 变更选择为 “Shipping”,进行优化打包即可。

使用新编译好的UE5 Engine Editor打开项目,建议“Binary Configuration”设置为“Shipping”,进行重新打包即可生成优化后的服务器版本。

参考资料

1.https://aws.amazon.com/cn/blogs/gametech/compiling-unreal-engine-5-dedicated-servers-for-aws-graviton-ec2-instances/

2.https://aws.amazon.com/cn/blogs/gametech/fire-up-your-unreal-engine-based-game-on-all-graviton-cores/

3.https://dev.epicgames.com/documentation/en-us/unreal-engine/linux-development-requirements-for-unreal-engine

4.https://github.com/aws/aws-graviton-getting-started/blob/main/perfrunbook/optimization_recommendation.md

5.https://github.com/aws/aws-graviton-getting-started/blob/main/c-c++.md

6.https://dev.epicgames.com/documentation/en-us/unreal-engine/build-configuration-for-unreal-engine

7.https://dev.epicgames.com/documentation/en-us/unreal-engine/lyra-sample-game-in-unreal-engine

8.https://forums.unrealengine.com/t/add-flags-when-cross-compile-linux-from-windows/454264/2

9.https://dev.epicgames.com/documentation/en-us/unreal-engine/build-configurations-reference-for-unreal-engine?application_version=5.4

本篇作者

6f996370ba8d298fe329bf9ee3637e72.jpeg

王睿

亚马逊云科技高级解决方案架构师。曾任过SRE以及Game SDE,在游戏和云计算行业有丰富的实践经验。

ad7318325850674203e98f8c88a08c8e.jpeg

汤力嘉

亚马逊云科技高级解决方案架构师,负责基于亚马逊云科技的云计算方案的架构设计,在游戏、多媒体方向有丰富部署实践经验。

a5c78f009f5e0c9b6d7e1588341cc77c.png

1d8a98847b9d7f0fee29055c8ec91a0d.gif

星标不迷路,开发更极速!

关注后记得星标「亚马逊云开发者」

听说,点完下面4个按钮

就不会碰到bug了!

524879bc0b55ca7d048673dc263995d6.gif

点击阅读原文查看博客!获得更详细内容!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值