GameLift 的工作原理 - Amazon GameLift
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

GameLift 的工作原理

本主题提供了 GameLift 托管解决方案的一般概述。其中涵盖了游戏托管的核心组件,并描述了 GameLift 如何向玩家提供您的多人游戏服务器。如果您想了解有关 GameLift 托管托管机制的详细信息,请开始阅读本主题和以下相关主题。要了解其他 GameLift 解决方案,请参阅。什么是 Amazon GameLift?

准备好在 GameLift 上开始托管您的游戏? 请参阅这些开始使用 Amazon GameLift 主题,包括集成路径。

关键组件

设置 GameLift 托管您的游戏需要使用以下组件。这些组件之间的关系在使用托管的 GameLift 架构 中有说明。

  • 游戏服务器是指在云中运行的游戏服务器软件。您上传您的游戏服务器生成包(或script如果您使用的是实时服务器)添加到 GameLift 服务,并告诉 GameLift 有多少个游戏服务器可用于游戏会话。

  • A游戏会话是你的游戏与玩家进行. 您定义游戏会话的基本特征,例如它的生命期和玩家数。玩家连接到游戏服务器以加入游戏会话。

  • 这些区域有:GameLift 服务管理托管游戏服务器的计算资源,并将玩家连接到游戏。它规定了主办游戏所需的资源,找到可用的游戏服务器来举办新游戏会话,并将玩家投入游戏。该服务还收集有关托管活动和服务器运行状况的指标。

  • 游戏客户端是指玩家设备上运行的游戏软件。玩家可以使用游戏客户端获取有关可用游戏会话和/或请求加入游戏的信息。GameLift 客户端根据游戏服务器收到的连接信息,直接连接到游戏服务器以加入游戏会话。

  • 游戏服务是您可能创建的额外的自定义服务,用于处理与 GameLift 相关的特殊任务。作为一种最佳做法,所有客户端与 GameLift 服务的通信都由客户端服务处理;出于安全原因和效率的考虑,建议这样做。

有关这些组件之间交互方式的详细说明,请参阅 GameLift 和游戏客户端/服务器交互

托管游戏服务器

您上传的游戏服务器托管在 GameLift 虚拟计算资源上,称为实例。您可以通过创建队列并部署它们以运行您的游戏服务器(可以使自定义服务器或 Realtime 服务器)。您可以设计一个适合游戏需求的队组。

队组架构

构建适合您核心需求的队组。

  • 您的游戏需要哪种类型的资源? — GameLift 支持多种操作系统和实例类型。实例类型是计算硬件的特定配置,包括处理能力、内存和网络容量。请注意,托管成本基于您使用的实例类型、位置和数量。根据游戏的要求,您可以选择使用多个小实例或者较少但处理能力更强的实例。了解有关如何选择计算资源的更多信息。

  • 您希望在哪里运行游戏服务器? -您可以将队组设置为在有玩家等待加入游戏的任意位置部署实例。您可以构建多位置队列,将实例部署到任何或所有Amazon 区域,这些都是在 GameLift 中支持的。请参阅有关的更多信息使用 Amazon GameLiftAmazon区域

  • 游戏服务器的稳定性有多重要? -您的队组使用竞价型实例或按需实例。Spot 实例(基于 EC2 的 Spot 实例)通常成本更低,但是可能会在游戏会话期间中断。不过,GameLift 有额外的保护机制,确保游戏中断的情况极少发生,对于大多数游戏而言,使用 Spot 实例的队组是理想之选。按需实例则相反,提供稳定的可用性,但价格更高。对于游戏中断会对玩家造成很大影响的游戏,这是理想之选。了解有关按需实例与 Spot 实例的更多信息。

  • 您需要支持多少个玩家? -队组可以有多个实例,每个实例可以同时托管多个游戏会话。您可以根据需要在队组中添加或删除实例,并可以使用 auto-scaling,在玩家需求变动时自动进行调整。了解有关扩展 队组容量的更多信息。

服务器运行时配置

一个队组实例可以同时运行多个进程,并可以运行您的游戏服务器生成包中的任意可执行文件。要确定每个实例应运行的进程,您需要创建运行时配置。该配置指定:(1) 要运行的可执行文件,(2) 每个可执行文件同时运行多少个进程,以及 (3) 启动各个可执行文件时使用的所有启动参数。实例可以同时运行的进程数取决于实例的计算能力(实例类型)以及游戏服务器生成包的需求。了解有关在一个队组上运行多个进程的更多信息。运行时配置可以在队组的整个生命周期内更新。

运行时配置还会影响新游戏会话如何在实例上启动。一些游戏在启动阶段需要大量资源,限制在任意时间可用于激活新游戏会话的资源就是一个很好的做法。您可以指定每个实例同时进行的游戏会话激活最大数。您还可以对各个游戏会话激活施加时间限制,以快速检测和关闭未能激活的任意游戏会话。

队组别名

别名 是可以从一个实际队组传输到另一个队组的称号,从而方便地泛化队组位置。例如,游戏客户端需要指定在哪里(哪个队组)放置新游戏会话。使用别名,您可将游戏客户端从一个队组切换到另一个队组,而无需更改游戏客户端。您可以使用多种 GameLift 功能中的选项来指定队组或别名。您还可以创建一个“终端”别名,这使您可以指向内容(例如某个 URL)而不是连接到服务器。此功能很有用,例如,提示玩家升级其客户端。

运行游戏会话

在游戏服务器代码成功部署到队组并在每个实例上启动游戏服务器进程后,队组便已准备好托管游戏会话。当您的游戏客户端服务向 GameLift 服务发送放置请求时,将启动新的游戏会话。

游戏会话放置和 FleetIQ

游戏会话放置处理选择可用的游戏服务器以托管新游戏会话的任务。游戏会话放置的关键组成部分是 GameLift游戏会话队列。新游戏会话的每个放置请求都被发送到指定队列进行处理。

为游戏会话队列分配了一个列表,该列表决定了它可以放置游戏会话的位置。作为最佳做法,队列的队列因队列类型(竞价型或按需)、位置和/或实例类型(计算硬件)而异。这种多样性为队列提供了更大的灵活性,无论他们最适合玩家的位置。可以配置具有竞价型实例的队列,以最大限度地减少竞价型实例中断对游戏会话的影响。有关游戏会话队列以及如何为游戏设计它们的详细信息,请参阅设计游戏会话队列

游戏会话放置过程不仅仅是将新游戏会话与它找到的任何可用游戏服务器放置在一起。队列使用称为 FleetIQ 的特殊算法来查找每个游戏会话请求的 “最佳” 位置。有关 FleetIQ 的更多信息,请参阅。GameLift FFleetIQ 的工作原理。FleetIQ 算法根据低玩家延迟、托管成本、地理位置或其他队列特征优先搜索可用游戏服务器。

您可以创建一个游戏会话队列,为游戏的每个玩家池提供服务。玩家池是可以在同一场比赛中一起玩的人群。例如,对于讲不同语言或使用不同游戏版本的人,您可能有不同的玩家池。

注意

GameLift 为您提供手动定位和放置游戏会话的选项,如果您想构建自定义游戏会话放置机制,这是一个有用的选项。但是,这种方法会绕过 FleetIQ 提供的放置优化。如果您使用的是 FlexMatch 匹配或竞价型队列,则需要进行游戏会话队列。

玩家连接到游戏

作为游戏会话放置流程的一部分,队列将提示所选游戏服务器启动新的游戏会话。已与 GameLift 服务器 SDK 集成的游戏服务器响应提示并在准备接受玩家连接时向 GameLift 服务报告。然后,GameLift 服务以 IP 地址或 DNS 名称和端口的形式,将连接信息提供给游戏客户端服务。您的游戏客户端将使用此信息直接连接到游戏会话并开始游戏。

您可以选择设置游戏服务器,使用 GameLift 服务验证传入的玩家,并定期报告玩家连接状态。建议使用这些选项来帮助 GameLift 跟踪游戏会话的使用情况。

扩展 队组容量

当某个队组激活并准备好托管游戏会话后,您可以调整队组容量以满足玩家需求。托管的成本取决于您使用的容量,因此,您需要在确保所有传入的玩家都能找到游戏与过度使用闲置资源之间找到平衡。

您可以通过调整队组中的实例数量来扩展队组。对于在多个位置具有实例的车队,您可以按位置调整容量,而不是整个队列。

运行时配置确定每个实例可以承载多少游戏会话和玩家,因此通过扩展实例,您可以增加或减少游戏会话和玩家的可用性。GameLift 提供了一个高效的 auto-scaling 工具,您也可以选择手动设置车队容量。了解有关如何扩展 GameLift 托管容量的更多信息。

自动扩展

启用 auto-scaling 后,GameLift 会跟踪队组的托管指标,并根据您定义的一组准则确定何时添加或删除实例。有了正确的 auto-scaling 策略,GameLift 可以根据玩家需求的变化直接调整容量。了解有关利用自动扩展提高成本效益的更多信息。对于多位置队列,auto-scaling 策略适用于整个车队,但您可以选择为每个位置打开或关闭它们。

自动扩展有两种方法:

  • 基于目标的扩展-使用此方法,您指定所需的结果,GameLift 将扩展或缩减队组以实现相应结果。目标跟踪使用指标“可用游戏会话百分比”,也即,当前未托管游戏会话的正常运行的服务器进程的百分比。可用的游戏会话是您的缓冲区,它们代表可以在最短等待时间内加入游戏的新游戏会话和新玩家的数量。使用目标跟踪,您选择适合您的游戏的缓冲区大小。例如,对于需求高度波动的游戏,您可能需要更大的缓冲区大小。此方法是首选方法,因为它对更多游戏更简单、更有效。了解有关“目标跟踪”如何工作的更多信息。

  • 基于规则的扩展-此方法提供了对扩展操作的更精细的控制。它的设置和管理也更加复杂,并且更可能产生意想不到的结果。每个策略都指定何时触发扩展事件以及响应时应采取的措施。例如,策略可能会声明:“如果空闲实例数量连续 10 分钟降到 20 个以下,则将容量增加 10%。” 大多数队组需要多个策略来有效地管理队组容量,但是多个策略可能会产生意想不到的组合影响,从而增加了复杂性。了解如何使用基于规则的策略自动扩展

实际操作中的容量扩展

可以通过多种方式触发扩展事件:通过自动扩展或手动扩展对所需容量进行更改,或者出于运行状况或其他原因而关闭实例。实质上,所有扩展事件都是在队组或位置的 “所需的” 实例计数与其 “活动的” 实例计数不相符时触发。此情况会导致 GameLift 根据需要添加或删除实例,以使活动的实例计数与所需的实例计数相符。

  • 当所需的实例计数超过活动的实例计数时,GameLift 将请求其他实例,一旦有其他实例可用,就会开始安装游戏服务器生成包和启动游戏服务器进程的过程。一旦有一个服务器进程在实例上激活,活动的实例数就会加一。GameLift 继续添加实例,直到两个计数值相等。

  • 当活动的实例数超出所需的实例计数时,GameLift 开始搜索它可以删除的实例。任何可用的实例(即未托管任何游戏会话的实例)以及任何不受保护的实例(即使托管游戏会话)都可以终止。如果没有实例可以删除,则缩减事件失败。在此情况下,所需的实例计数与活动的实例计数之间的不一致将继续触发缩减事件,直到有实例可以删除。然后,GameLift 启动终止流程,其中包括通知此实例上的所有服务器进程启动正常关闭。一旦终止了实例,活动实例的数量就会减一。GameLift 继续删除实例,直到活动和所需的实例计数值相等。

其他扩展功能

队组容量和扩展相关的其他功能包括:

  • 游戏会话保护-防止托管活动的玩家的游戏会话在缩减事件期间被终止。游戏会话保护可以在队组范围开启,也可以针对单独的游戏会话开启。如果实例的任何服务器进程正在托管受保护的游戏会话,则无法终止此实例。游戏会话由于运行状况或 Spot 实例相关的中断而不受保护,导致被终止 (请参阅按需实例与 Spot 实例)。

  • 扩展限制— 通过对队组中的实例数设置最小和最大限制,控制总体实例使用情况。这些限制在自动扩展或手动设置容量时适用。

  • 启用/禁用 auto-scaling-在队组级别启用或禁用 auto-scaling,而不更改或删除自动扩展策略。此功能可让您在需要时手动暂时扩展您的队组。

  • 扩展指标— 以图形方式跟踪队组的容量和扩展事件的历史记录。查看容量以及队组利用率指标,以评估扩展方法的有效性。

监控车队活动和故障排除

在队组设置完毕并开始运行后,GameLift 会收集各种信息,以帮助您监控已部署的游戏服务器的性能。此信息可用于优化资源使用、排除问题以及深入了解玩家在游戏中的活动情况。

  • 队列、位置、游戏会话和玩家会话详细信息-此数据包括可帮助识别运行状况问题的状态,以及游戏会话时长和玩家连接时间等详细信息。

  • 利用率指标— GameLift 在一段时间内跟踪队组指标。

    • 对于实例:网络活动和 CPU 使用率

    • 对于服务器进程:活动进程数、新激活和终止

    • 对于游戏和玩家:活动游戏会话和玩家会话的数量

  • 服务器进程运行状-GameLift 跟踪队组中运行的每个服务器进程的运行状况,包括正常运行的进程数、正常运行的活动进程的百分比以及异常终止的数量。

  • 游戏会话日志-您可以让游戏服务器记录会话数据,并设置 GameLift 在游戏会话结束时收集和保存日志。日志随后可从服务中下载。

所有数据均可通过GameLift 控制台。控制台控制面板显示所有生成包和队组中的活动的概览,以及查看更多详细信息的选项。

与其他交互Amazonresources

在许多情况下,您希望您的托管游戏服务器和应用程序能够与其他Amazon资源的费用。例如,您可能使用一组 Web 服务来进行玩家身份验证或社交网络。由于资源所有权问题,这种通信面临一个挑战。当您使用 Amazon GameLift 部署游戏服务器时,队组和实例分配给您的账户,但它们却为 GameLift 服务所有并受其管理。因此,要访问Amazon资源,这些资源由Amazon帐户,您需要明确授予 Amazon GameLift 服务的访问权限。

GameLift 提供了几个用于管理此类访问的选项。了解有关如何与其他Amazon来自队列的资源的更多信息。