亚马逊AWS官方博客
在亚马逊云科技 Graviton 4 上运行 Unreal Engine 5 的 Dedicated Server
Unreal Engine 和亚马逊云科技 Graviton 介绍
Epic Games 是业界领先的互动娱乐公司和 3D 引擎技术提供商。 虚幻引擎(Unreal Engine,简称 UE)是先进的开源实时 3D 创作工具之一,为包括《堡垒之夜 Fortnite》在内的一些大型游戏提供动力,也被各行各业的创作者所使用。
亚马逊云科技 Graviton 是亚马逊云科技子公司 Annapurna Labs 设计的一系列 ARM64 架构的 CPU。与 X86-64 的 CPU 相比,Graviton 的 CPU 能耗更低、CPU 时钟频率更稳定,同时避免了 SMT 切换的开销。 2018 年亚马逊云科技发布了第一款 Graviton 实例 A1,这是第一款主流云厂商大规模部署的 ARM 实例。在之后的 2020 年和 2022 年,亚马逊云科技陆续发布了 Graviton 2 和 Graviton 3 的实例 6g 和 7g,性价比逐步提升(相较于 6 系的 X86 实例分别提升 40% 和 65%)。
而在今年发布的最新的 Graviton 4 实例,则是迄今为止亚马逊云科技为各种 workload 设计的最强大并且最高效节能的 CPU。Graviton 4 的实例 R8g 相较于 Graviton 3 的实例 R7g 有大约 30% 的性能提升。早在 2023 年 re:Invent 上,R8g 实例刚刚 preview 的时候,就有超过 100 家客户将他们的 workload 部署在 R8g 上进行测试,并且获得了显著的性能提升,其中就包括 Epic Games。
Epic Games 早在 2021 年就在他们的游戏《堡垒之夜》中大规模使用 Graviton 的案例,在他们的测试中显示,即使是延迟要求最高的那一类游戏,Graviton 3 的实例 C7g 也非常适合,并且还有显著的性价比提升。而在最新的 Graviton 4 实例的测试中,他们发现性能相较于 Graviton 3 更强。目前 Epic Games 已使用了上万个 Graviton 的芯片来承载他们的游戏业务,Graviton 给 Epic Games 带来的价值不仅限于《堡垒之夜》这一款游戏,还包含了所有用 Unreal Engine 构建 Dedicated Server 的游戏。
UE Engine 从 4.27 版本开始已经支持 ARM 架构的 Dedicated Server,使开发者可以很容易地将 Dedicated Server 代码重新编译为 ARM64 的二进制文件。这篇文章将向你展示如何将 UE5 Lyra Sample Game 在亚马逊云科技最新的搭载了 Graviton 4 芯片的 ARM 架构实例 R8g 上运行。
部署步骤
环境准备
- 申请访问 Unreal Engine 源码:https://www.unrealengine.com/en-US/ue-on-github 并下载,本文使用 5.4.3 版本源码
- 启动 g4dn.16xlarge 实例,选择系统环境 AMI:Microsoft Windows Server 2022 Base
- 安装 Visual Studio Community 2022 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 选择安装的组件包和推荐设置
- 因为我们需要在 Windows 上编译 Linux ARM64 的 Dedicated Server,需要安装交叉编译工具链,5.4.3 版本对应 v22 版本,需要下载:https://cdn.unrealengine.com/CrossToolchain_Linux/v22_clang-16.0.6-centos7.exe
- 安装 NVIDIA GPU 驱动,这里选择安装 gaming 驱动 https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/install-nvidia-driver.html#nvidia-gaming-driver
- 从 Microsoft 官网下载并安装 Direct X:https://www.microsoft.com/en-us/download/details.aspx?id=35&msockid=31eed1e2d74d6b343f89c526d6846a99
源码编译 UE5 Engine Editor
- UE5 引擎源码解压到 C:\UnrealEngine ,注意目录太长会出错。另外需要特别注意,如果是使用 Windows 自带的解压缩工具,需要先选中文件点击鼠标右键,选择“属性”,点击 unlock,这样才可以正确解压所有文件
- 参考安装指导:https://github.com/EpicGames/UnrealEngine完成以下设置:
- 执行
C:\UnrealEngine\Setup.bat
,会自动安装 UE5 需要的相关环境 - 注意里面用到的 .net 3.5 framework 在 Windows Server 中无法直接安装,需要在 Server manager 里通过 Add Roles and Features Wizard 进行安装
- 执行
C:\UnrealEngine\GenerateProjectFiles.bat
,这一步会生成 VS2022 要用到的.sln
文件,UE5.sln - 如果提示找不到相关包,考虑增加在线源,参考:
- 打开 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
- 双击打开新生成的 UE5.sln,设置 solution configuration 为 Development Editor,设置 solution platform 为 Win64
- 右侧 Solution Explorer,在
Engine
->UE5
点击右键,选择Build
启动 UE5 Editor 编译,该步骤需要比较长的时间 - 编译完成后会生成一个 Win64 的 UE5 Engine Editor 在
C:\UnrealEngine\Engine\Binaries\Win64\UnrealEditor.exe
- 至此,我们已经成功在 Windows 上编译安装了 UE5 Engine Editor
使用 UE5 Engine Editor 创建游戏项目
Epic 官方提供了一款多人演示游戏 Lyra Sample Game project,其中包括客户端、服务器、资产文件和代码。我们可以使用这个项目来进行测试。
下载 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 并创建
![]() |
项目已经在 我的文档\Unreal Projects 中生成,构建和打包游戏的第一步是为 Lyra 生成 Visual Studio 项目文件。打开游戏项目的目录。选择 LyraStarterGame.uproject 文件并鼠标选择 “Generate Visual Studio project files”,可以生成 LyraStarterGame.sln 项目文件
![]() |
调整工程参数
打开 LyraStarterGame.uproject 文件,在 Unreal Editor 中打开 Lyra。在为 Lyra 构建 Dedicated Server 和客户端版本之前,需要调整以下几点:
将服务器默认地图设置为 L_Expanse,打开菜单栏“Edit”->“Project Settings”
![]() |
选择 “Maps & Modes”,打开 “Default Maps” 下的 “Advanced” 部分,将 Server Default Map 设置为 L_Expanse。完成此操作后,您可以关闭 “Project Settings” 窗口
![]() |
还需要更改默认生成的机器人数量,这样它们就不会在连接到服务器后立即开始攻击客户端。机器人更改还将使您可以更轻松地查看客户端何时连接/断开与服务器的连接。后续可以随时对这些值进行修改。为此,请选择编辑器屏幕左下角的“Content Drawer”
![]() |
选择目录“Plugins”,然后搜索 B_ShooterBotSpawner 并选择出现的 B_ShooterBotSpawner Blueprint Class,双击打开设置面板
![]() |
在 Gameplay 章节中,修改 Num Bots to Create 为 0,点击左上角的“Compile”进行编译
![]() |
进行编译
关闭 Unreal Editor 并打开 LyraStarterGame.sln
确认项目的源目录中有 LyraServer.target.cs 文件。如果没有,则需要创建一个,然后打开该文件。从 “Solution Configuration” 工具栏中选择 “Development Server”
![]() |
选择菜单中的“Build”->“Build Solution”
![]() |
完成后,将 “Solution Configuration” 工具栏中的选择更改为 “DevelopmentClient”,再次选择菜单中的“Build”->“Build Solution”来重复生成步骤。
内容烘焙
将内容从内部格式转换为特定于平台格式的过程称为烘焙。在玩游戏之前,你需要进行内容烘培。为此,请在虚幻引擎编辑器中重新打开 LyraStarterGame 项目。选择“platforms”下拉列表,选择 Windows,确认“Binary Configuration”设置为 “Development”,确认“Build Target”设置为“LyraServer”,然后选择“Cook Content”。过程完成后,可以在项目的二进制文件目录中找到服务器二进制文件:Documents/Unreal Projects/LyraStarterGame/Binaries/Win64/LyraServer.exe
![]() |
类似地,还需要烘培客户端的内容。为此,请将编译目标更改为 LyraClient,然后再次选择“Cook Content”
![]() |
本地测试
这时可以启动服务器和客户端进行测试了,要启动服务器程序,需要打开一个 PowerShell 窗口,进入对应目录,然后执行以下命令:
.\Binaries\Win64\LyraServer.exe -log -port 7777
可以看到专用服务器已经启动,并可以看到日志输出:
![]() |
启动另一个 Powershell 窗口并运行以下命令以启动游戏客户端并将其连接到服务器
.\Binaries\Win64\LyraClient.exe 127.0.0.1:7777 -WINDOWED -ResX=800 -ResY=450
可以看到类似以下的游戏画面:
![]() |
为 亚马逊云科技 Graviton 实例构建和打包 Dedicated Server
现在我们已经验证了游戏和 Dedicated Server 均正常运行,我们可以为亚马逊云科技 Graviton EC2 实例构建和打包我们的 Dedicated Server。为此,请返回虚幻引擎编辑器。在“platforms” 下拉列表选择 LinuxArm64。确认“Binary Configuration”设置为“Development”,“Build Target”设置为“LyraServer”,然后选择“Cook Content”
![]() |
由于我们将在不同的主机和操作系统上运行服务器,因此我们还需要打包内容。为此,我们在“platforms”中选择“LinuxArm64”,然后选择“Package Project”。在弹出的文件资源管理器窗口中选择输出二进制文件的目录,将会在你选择的文件夹中创建一个名为 LinuxArm64Server 的目录,压缩这些文件并拷贝到 Linux 机器上安装运行
![]() |
在 Graviton 服务器上安装 Dedicated Server
在 Amazon EC2 控制台中启动 Graviton 实例进行测试,可以选择不同的 Graviton 实例进行测试,这里选择最新的 Graviton 4 代实例 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 是 Graviton 4 的参数,Graviton 3 使用 neoverse-v1
请修改 Unreal Engine 的源码,在 C:\UnrealEngine\Engine\Source\Programs\UnrealBuildTool\Platform\Linux\LinuxToolChain.cs:344 加入:
重新打开 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”,进行重新打包即可生成优化后的服务器版本。
参考资料
- https://aws.amazon.com/cn/blogs/gametech/compiling-unreal-engine-5-dedicated-servers-for-aws-graviton-ec2-instances/
- https://aws.amazon.com/cn/blogs/gametech/fire-up-your-unreal-engine-based-game-on-all-graviton-cores/
- https://dev.epicgames.com/documentation/en-us/unreal-engine/linux-development-requirements-for-unreal-engine
- https://github.com/aws/aws-graviton-getting-started/blob/main/perfrunbook/optimization_recommendation.md
- https://github.com/aws/aws-graviton-getting-started/blob/main/c-c++.md
- https://dev.epicgames.com/documentation/en-us/unreal-engine/build-configuration-for-unreal-engine
- https://dev.epicgames.com/documentation/en-us/unreal-engine/lyra-sample-game-in-unreal-engine
- https://forums.unrealengine.com/t/add-flags-when-cross-compile-linux-from-windows/454264/2
- https://dev.epicgames.com/documentation/en-us/unreal-engine/build-configurations-reference-for-unreal-engine?application_version=5.4