亚马逊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 2Graviton 3 的实例 6g7g,性价比逐步提升(相较于 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 上运行。

部署步骤

环境准备

源码编译 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 加入:

            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”,进行重新打包即可生成优化后的服务器版本。

参考资料

本篇作者

王睿

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

汤力嘉

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