使用 Amazon GameLift 进行混合托管的开发路线图
本路线图将指导您如何为多人游戏开发托管解决方案。Amazon GameLift 提供多个游戏托管方案;有关这些方案的更多信息,请参阅 Amazon GameLift 解决方案。
混合解决方案使用托管资源的组合,包括由 Amazon GameLift 管理的基于云的资源以及您自己的自管理式托管资源。有关混合托管的更详细讨论,请参阅以下文章:Hybrid game server hosting with Amazon GameLift Anywhere
混合架构包含以下组件:
-
一个或多个 Amazon GameLift 托管式实例集,使用针对多人游戏托管进行了优化的 Amazon Elastic Compute Cloud(Amazon EC2)实例。
-
一个或多个 Amazon GameLift Anywhere 实例集,使用您现有的本地或其他托管资源,包括您的配置管理和部署工具。(您可以选择使用 AWS Systems Manager。)
-
一个与 Amazon GameLift 服务器 SDK 集成的游戏服务器生成包,可在所有实例集中部署。
-
一个与 AWS SDK 集成的游戏客户端和后端服务,用于与 Amazon GameLift 服务交互和请求游戏会话。
-
一个共享的 Amazon GameLift 队列,用于放置在所有实例集中都有可用游戏服务器和均衡负载的新游戏会话。
-
与 Anywhere 实例集一起部署的 Amazon GameLift 代理,用于简化所有实例集中跨计算的服务器进程管理任务。
-
(可选)一个 FlexMatch 对战构建器,用于创建多人对战并为其设置游戏会话。
本路线图提供了一个简化的路径,让您的多人游戏可以在使用 Amazon GameLift 的混合托管解决方案中成功启动并运行。准备好必要的组件后,您就可以继续迭代游戏开发并自定义您的托管解决方案。临近发布时,请参阅使用 Amazon GameLift 托管为游戏发布做准备,帮助您为生产级使用准备托管解决方案。
利用 Amazon GameLift 插件快速开始
如果您正在使用 Unreal Engine 或 Unity 开发项目,请开始使用 Amazon GameLift 插件设置游戏进行托管。借助该插件,您可以将 Amazon GameLift SDK 添加到您的游戏项目,并使用引导式工作流程来构建混合托管解决方案的简单有效版本,其中包含 Anywhere 实例集和 Amazon GameLift 托管式实例集。然后,您可以在这些基础上进行构建和按需自定义。
为您的游戏服务器添加功能,使其在为托管进行部署时能与 Amazon GameLift 服务进行通信。如果游戏服务器在 Amazon GameLift 托管式实例集或 Anywhere 实例集上运行,则也需要这项功能。
-
为您的游戏项目获取 Amazon GameLift 服务器 SDK(版本 5.x)。服务器 SDK 支持 C++、C# 和 Go 语言。下载 Amazon GameLift 服务器 SDK。
-
修改游戏服务器代码以添加服务器 SDK 功能。有关指南,请参阅将游戏与自定义游戏服务器集成。至少执行以下操作:
-
添加代码,以初始化 Amazon GameLift SDK 并与 Amazon GameLift 服务建立 WebSocket 连接。使用服务器 SDK 操作
InitSdk()
。在 Anywhere 实例集计算上运行时,加入指定服务器参数的代码。 -
添加代码,以在服务器进程准备好托管游戏会话时向 Amazon GameLift 服务报告。使用服务器 SDK 操作
ProcessReady()
。 -
实施所需的回调函数
OnRefreshConnection()
、OnProcessTerminate()
和OnStartGameSession()
。借助这些函数,游戏服务器进程可以保持与 Amazon GameLift 服务的连接、在 Amazon GameLift 提示启动游戏会话时执行该操作,以及响应结束游戏服务器进程的提示。 -
添加代码,以在服务器进程结束游戏会话时向 Amazon GameLift 服务报告。使用服务器 SDK 操作
ProcessEnding()
。
-
-
打包游戏服务器生成包。使用生成包文件、依赖项和支持软件创建安装脚本。请参阅打包游戏生成包文件。我们建议使用 Amazon Simple Storage Service(Amazon S3)存储桶来存储游戏生成包的版本。
-
测试游戏服务器集成。对于这项任务,我们建议为本地工作站设置 Amazon GameLift Anywhere 实例集,如使用 Amazon GameLift Anywhere 设置本地测试中所述。在此步骤中,手动将游戏服务器生成包安装到测试设备上,然后启动服务器进程。使用 AWS CLI 请求一个新的游戏会话,并验证 Amazon GameLift 服务是否成功提示您的服务器进程启动游戏会话。
为您的游戏客户端创建一种方法,使其能够请求加入游戏会话、获取连接信息,然后直接连接到托管的游戏会话。最常见的方法是设置后端服务功能,作为游戏客户端和 Amazon GameLift 服务之间的桥梁。此方法可以保护您的托管资源,并让您更好地控制玩家进入游戏会话的方式。
-
构建用于托管的后端服务功能。后端服务会与 Amazon GameLift 服务通信并向游戏客户端提供连接信息。此功能包括启动游戏会话、将玩家放入游戏以及检索游戏会话信息。有关指南,请参阅将游戏与自定义游戏服务器集成。至少执行以下操作:
-
获取适用于 Amazon GameLift 的 AWS SDK 并将其添加到您的后端服务项目。请参阅 Amazon GameLift SDK resources for client services。
-
添加代码以初始化 Amazon GameLift 客户端并存储密钥设置。请参阅在后端服务上设置 Amazon GameLift。
-
添加调用 AWS SDK 操作
CreateGameSession()
并向游戏客户端提供游戏会话连接信息的功能。请参阅 Create a game session on a specific fleet。调用
CreateGameSession()
是请求新游戏会话的一个方便的入手点。在部署游戏会话放置系统(请参阅步骤 3)后,您需要将此代码替换为对StartGameSessionPlacement()
(如果您使用的是 FlexMatch,则为StartMatchmaking()
)的调用。有关设计后端服务的指导,请参阅设计您的游戏客户端服务。
-
-
向游戏客户端添加允许玩家加入托管游戏会话的功能。游戏客户端将向您的后端服务发出请求,而不是直接向 Amazon GameLift 发出请求。在后端服务提供游戏会话连接信息后,游戏客户端会直接连接到游戏会话来玩游戏。
-
测试游戏客户端集成。您可以使用与本地工作站相同的 Amazon GameLift Anywhere 实例集进行测试。
在开发阶段,如果您想测试您的游戏生成包在 Amazon GameLift 托管式实例集中的行为方式,我们建议您还设置一个基于云的测试环境。此 Amazon GameLift Toolkit 解决方案可模拟托管式实例集的行为,而且让您能够以最短的周转时间更新游戏服务器生成包。
自定义您希望 Amazon GameLift 处理新游戏会话请求的方式,并找到可用的游戏服务器来托管这些请求。Amazon GameLift 会自动跟踪所有实例集上的所有游戏服务器的可用性。当游戏客户端发送加入游戏会话的请求时,Amazon GameLift 会根据一组已定义的优先级(如最低延迟、成本和可用性)寻找“最佳”放置。
-
创建游戏会话队列,用于将新的游戏会话与可用的游戏服务器一起放置。队列是游戏会话放置的主要机制。有关指南,请参阅创建游戏会话队列。
-
至少在队列中将您的 Anywhere 实例集添加为目标。所有其他设置都是可选自定义项。
-
-
在后端服务代码中,将
CreateGameSession()
调用转换为StartGameSessionPlacement()
。请参阅 Create a game session in a multi-location queue。 -
创建一个机制,用于在游戏会话准备好加入时通知游戏客户端。在开发过程中,您可以使用对 DescribeGameSessionPlacement 的调用来轮询游戏会话状态。但是,在使用队列处理大量数据之前,您需要启用事件通知。请参阅请参阅设置游戏会话置放通知。。
-
(可选)添加 FlexMatch 对战组件。有关指南,请参阅 Amazon GameLift FlexMatch 开发人员指南。
到目前为止,您一直在使用本地设备(注册为 Anywhere 实例集计算)来测试和迭代游戏组件。下一步是设置生产系统所需的实例集类型。首先配置一个 Anywhere 实例集,然后添加 Amazon GameLift 代理来管理一些关键的计算上主机管理任务。有关更多详细信息,请参阅使用 Amazon GameLift 代理。
-
获取 Amazon GameLift 代理并将其添加到游戏服务器安装包。获取并构建代理源代码(可在 Amazon GameLift 代理 Github 存储库
中找到)。将生成的 JAR 文件可执行文件放在与游戏生成包可执行文件相同的目录中。 -
根据需要修改代理的启动脚本。确保在计算开始运行后立即启动代理可执行文件。如需获取在托管计算上安装和运行代理方面的帮助,请参阅代理存储库中的自述文件。启动命令应至少包含用于指定 Anywhere 实例集 ID、AWS 区域、自定义位置和计算名称的选项。
代理会自动为您处理以下任务,因此,如果您一直使用脚本处理这些任务,则可以将脚本删除:
-
调用
RegisterCompute()
,将计算添加到 Anywhere 实例集。 -
调用
GetComputeAuthToken()
,在游戏服务器连接到 Amazon GameLift 服务时对该服务器进行身份验证。代理负责管理身份验证令牌的获取和刷新,在计算上运行的所有游戏服务器进程都可以使用该令牌。 -
根据一组运行时指令在计算上启动新的服务器进程。
-
-
为 Anywhere 实例集中的计算创建运行时配置。至少为游戏服务器可执行文件指定启动路径。您可以使用 Amazon GameLift 控制台或 AWS CLI 为实例集创建或修改运行时指令。代理将执行这些指令并定期从 Amazon GameLift 服务请求更新。
-
根据需要设置或修改游戏会话队列。创建新队列(或更新现有队列),并为随 Amazon GameLift 代理部署的 Anywhere 实例集指定目标。
-
测试代理与 Anywhere 实例集的集成。检查代理是否根据运行时配置正确启动服务器进程。
创建 Amazon GameLift 托管式 EC2 实例集,以补充您的 Anywhere 实例集。如果您在步骤 2 中设置了基于云的测试环境以加快开发速度,请计划在完成大部分游戏开发和测试后创建托管式实例集。您需要一个完全托管式实例集来配置和测试其他设置,如自动容量扩展。
-
打包游戏服务器生成包并上传到 Amazon GameLift。使用生成包文件、依赖项和支持软件创建安装脚本。您可以对 Anywhere 和托管式实例集使用相同的生成包软件。请参阅为 Amazon GameLift 托管部署自定义服务器生成包。您可以使用控制台或 AWS CLI 将生成包上传到 Amazon GameLift。
在上传生成包之前,请确定要在哪个 AWS 区域中创建托管式实例集。您必须将生成包上传到同一区域。有关选择实例集位置的更多信息,请参阅实例集位置。
-
创建托管式 EC2 实例集。您可以使用 Amazon GameLift 控制台或 AWS CLI 创建托管式实例集。创建实例集时,Amazon GameLift 会立即开始部署游戏服务器生成包进行托管。您可以配置托管式实例集的许多方面。有关指南,请参阅创建 Amazon GameLift 托管式 EC2 实例集。至少执行以下操作:
-
为实例集命名并指定要部署的已上传游戏生成包。
-
为实例集选择按需型实例,并选择在实例集所在位置可用的实例类型。竞价型实例集是一个很有价值的选择,但需要额外的设计和配置。
-
使用与 Anywhere 实例集相似的设置创建运行时配置。至少为游戏服务器可执行文件指定启动路径。
-
指定端口设置以允许入站流量访问游戏服务器。
-
-
将托管式实例集添加到共享游戏会话队列。更新步骤 4 中的队列,使其包含一些针对托管式实例集和随 Amazon GameLift 代理部署的 Anywhere 实例集的目标。
-
使用托管式实例集测试游戏托管。此时,您应该能够测试整个托管周期,即游戏客户端请求游戏会话、获取连接信息和成功连接到游戏会话。
在为游戏发布做准备时,您需要对托管解决方案进行微调。需要考虑的决策包括:
-
对于 Anywhere 实例集,根据需要自动启动和关闭计算,包括安装和运行游戏服务器软件。回收计算有助于确保计算定期更新,而关闭不需要的计算则可以节约成本。
-
如果您的游戏服务器需要与其他 AWS 资源通信,请设置 IAM 角色来管理访问。请参阅与您的实例集中的其他 AWS 资源进行通信。
-
确定要将游戏服务器放置在哪个地理位置。将偏远位置添加到您的托管式实例集。请参阅托管式实例集设计指南。
-
对于托管式实例集,考虑使用竞价型实例集来节省成本。请参阅教程:使用竞价型实例创建 Amazon GameLift 队列。
-
通过选择计算资源配置来优化实例集性能,然后配置运行时指令,使每个计算运行最优数量的服务器进程。请对 Anywhere 实例集和托管式实例集执行此操作。请参阅管理 Amazon GameLift 如何启动游戏服务器。
-
试验适用于托管式实例集的游戏会话放置选项,包括自定义优先级设置。请参阅设计游戏会话队列。
-
对于托管式实例集,设置自动容量扩展以满足预期的玩家需求。请参阅利用 Amazon GameLift 扩展游戏托管容量。
-
对于 Anywhere 实例集,创建处理手动或自动容量扩展的机制,以满足预期的玩家需求。
-
根据需要设计并实施到其他资源的失效转移。在其他 AWS 区域中设置备用实例集,并修改队列和自动扩缩,以便在需要时处理失效转移。
-
设置托管可观测性工具,包括分析和日志记录。请参阅监控 Amazon GameLift。创建指标组以汇总所有托管资源的分析。
-
使用基础设施即代码(IaC)自动执行部署。请参阅使用 AWS CloudFormation 管理 Amazon GameLift 托管资源。
Amazon GameLift 支持使用 AWS CloudFormation 模板进行任何特定于部署的配置。也可以使用 AWS Cloud Development Kit (AWS CDK) 定义您的Amazon GameLift 资源。有关 AWS CDK 的更多信息,请参阅 AWS Cloud Development Kit (AWS CDK) 开发人员指南。
为了管理 AWS CloudFormation 堆栈的部署,我们建议使用持续集成和持续交付(CI/CD)工具和服务,例如 AWS CodePipeline。这些工具可以帮助您在构建游戏服务器二进制文件时自动部署或在获得批准的情况下进行部署。使用 CI/CD 工具或服务时,新游戏服务器版本的资源部署可能如下:
-
构建和测试游戏服务器二进制文件。
-
将二进制文件上传到 Amazon GameLift。
-
部署具有新生成包的新实例集。
-
将新实例集添加到游戏会话队列,并删除具有先前生成包版本的实例集。
-
当具有先前生成包的实例集不再托管活动游戏会话时,请删除这些实例集的 AWS CloudFormation 堆栈。
-