Amazon GameLift
开发人员指南 (版本 )
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

实时服务器 的工作原理

本主题简要介绍了 Amazon GameLift 实时服务器 功能,讨论在哪些情况下非常适合您的游戏,并说明了 实时服务器 如何支持多人游戏。

什么是 Realtime 服务器?

实时服务器 是由 GameLift 提供以供您与多人游戏一起使用的轻量级的即用型游戏服务器。尽管许多游戏需要自定义游戏服务器来处理复杂的物理和计算,但对于许多其他游戏而言,这是过度了。由于 实时服务器 不再无需开发、测试和部署自定义游戏服务器,因此选择此解决方案有助于最大程度地减少完成游戏所需的时间和精力。

主要功能包括:

  • 游戏客户端/服务器交互的完整网络堆栈。 实时服务器 利用 TCP 和 UDP 通道进行消息发送。借助此功能,您还可以通过启用 GameLift 生成的 TLS 证书来选择使用内置服务器身份验证和数据包加密。

  • 核心游戏服务器功能。 Realtime 服务器可以启动(和停止)游戏会话,管理游戏和匹配数据,以及接受客户端连接。游戏服务器通过从每个客户端接收游戏状态信息并将其中继到游戏会话中的其他客户端,以维护同步的游戏会话状态。

  • 与 GameLift 服务集成。 GameLift 服务会触发 Realtime 服务器以启动游戏会话,在玩家连接时验证玩家,并从游戏服务器收集玩家连接状态和游戏运行状况。此功能必须集成到自定义游戏服务器中,并在 实时服务器 中完全实现。

  • 可自定义的服务器逻辑。 您可以配置 Realtime 服务器并使用服务器端游戏逻辑自定义它们,以使其最适合您的游戏。或者,提供最小的配置,并将其用作简单的中继服务器。了解有关自定义Realtime服务器的更多信息。

  • 实时更新 Realtime 配置和服务器逻辑。 您可以随时更新您的 Realtime 服务器配置。 GameLift 定期检查是否有更新的配置脚本,因此,一旦您上传新版本,它就会快速部署到您的队组并用于所有新的游戏会话。

  • FlexMatch 对战。 使用 实时服务器 的游戏客户端可以利用所有 FlexMatch 对战功能,包括大型比赛(尚不提供回填功能)。

  • 灵活控制托管资源。 对于使用 实时服务器 部署的游戏,您可以使用所有 GameLift 托管功能,包括自动缩放、多区域队列、带有 FleetIQ 的游戏会话放置、游戏会话日志记录和指标。您确定如何利用托管资源(通过运行时配置和其他控件)。

  • 计算资源范围选项。 Realtime 服务器在 Linux 上运行。您可以选择队组的计算资源类型(实例类型)以及是使用 Spot 实例还是按需实例。

  • AWS 可靠性。 与所有 GameLift 一样,实时服务器 的托管资源带来了 AWS 的高品质、安全性和可靠性。

通过创建托管资源队组并提供配置脚本来设置 Realtime 服务器。在实时服务器 使用入门中了解更多有关创建 Realtime 服务器和如何准备您的游戏客户端的信息。

为您的游戏选择 实时服务器

选择 实时服务器 而不是构建自定义游戏服务器主要取决于游戏对服务器复杂性的需求。您的游戏是否需要复杂的游戏逻辑和瞬间计算? 如果不需要,实时服务器 可能是适合您的游戏的更好解决方案。使用 实时服务器 以实现最佳效果的游戏包括轻量级游戏或管理游戏客户端上更高比例的计算工作的游戏。示例包括消息传递游戏,基于回合的策略游戏以及许多类型的手机游戏。实时服务器 与 FleetIQ 结合使用,可以提供出色的工具来最大程度地减少玩家延迟,尽管强大的自定义游戏服务器可能会更好地服务于对玩家延迟容忍度非常低的游戏(例如第一人称射击游戏和其他快速动作游戏)。

关键组件

使用 实时服务器 时,您可使用以下组件。在游戏架构与 实时服务器中了解有关这些组件及其如何协同工作的更多信息。

  • 为您的游戏提供客户端/服务器网络服务的 Realtime 服务器。当由 GameLift 服务触发时,它将启动游戏会话,在玩家连接时请求验证,并报告回玩家连接状态和游戏运行状况。服务器在所有连接的玩家之间中继游戏状态数据,并执行自定义游戏逻辑(如果提供)。

  • 游戏客户端是指玩家设备上运行的游戏软件。游戏客户端(通过客户端服务)对 GameLift 服务发出请求以发现要加入的游戏会话或开始新游戏,并连接到 Realtime 服务器来参与到游戏中。连接之后,游戏客户端可以通过 Realtime 服务器与游戏中的其他玩家发送和接收数据。

  • Realtime 脚本提供游戏的配置设置和可选的自定义游戏逻辑。该脚本可能包含最少的配置设置或具有较复杂的游戏逻辑。启动新的托管资源时,Realtime 脚本与 Realtime 服务器一起部署。脚本用基于 Node.js 的 JavaScript 编写。

  • GameLift 服务管理托管 Realtime 服务器所需的计算资源,并可以将玩家连接到游戏。它控制玩家需求的资源数,通过在活动的游戏会话中查找和预留玩家位置来处理玩家的加入请求,触发 Realtime 服务器以启动游戏会话,并在玩家连接到游戏服务器时对其进行验证。该服务还收集有关 Realtime 服务器运行状况和玩家使用情况的指标。

  • 游戏会话是在 Realtime 服务器上运行的游戏实例。玩家连接到游戏会话来与其他玩家一起玩游戏和交互。

实时服务器 如何管理游戏会话

GameLift 使用 实时服务器 管理游戏会话,方式与其使用完全自定义的游戏服务器处理游戏会话的方式相同。使用游戏客户端的玩家发送请求来创建新游戏会话或查找并加入现有游戏会话。创建游戏会话的大多数方法(包括游戏会话置放和 FlexMatch 对战)都在 实时服务器 中提供(对战回填尚不可用)。

一旦将 Realtime 服务器部署在托管实例队组上,服务器便会维持与 GameLift 服务的通信。Realtime 服务器在 GameLift 服务提示时启动游戏会话,并从服务接收可用的游戏会话和玩家数据,包括对战数据。如果您的游戏使用玩家会话来保留游戏位置或对玩家连接进行身份验证,则 Realtime 服务器可以在玩家连接时向 GameLift 服务发送验证请求。Realtime 服务器还将其运行状况回报到 GameLift 服务,并在玩家连接/断开连接以及游戏会话结束时通知此服务。它还响应来自 GameLift 的提示,以强制终止游戏会话。与 GameLift 服务的这种交互已完全嵌入到所有 实时服务器 中。

您可以选择通过将用于游戏会话管理的自定义逻辑内置到 Realtime 脚本中来添加此逻辑。您可能编写代码来访问服务器特定的对象,使用回调添加事件驱动的逻辑或基于非事件方案(例如计时器或状态检查)添加逻辑。例如,您可能想要访问游戏会话对象,或者在游戏会话开始或结束时触发动作。

实时客户端和服务器如何交互

在游戏会话期间,游戏中游戏客户端之间的交互通过消息传递来完成。游戏客户端使用消息交换活动、游戏状态和相关的游戏数据。游戏客户端将消息发送到 Realtime 服务器,然后服务器在游戏客户端间中继消息。游戏客户端使用 Realtime 客户端开发工具包与服务器进行通信,此客户端开发工具包必须集成到您的游戏客户端中。客户端开发工具包定义了一组同步 API 调用,使得客户端可以连接到游戏、发送和接收消息以及断开与游戏的连接。它还定义了一组异步回调,它们可在游戏客户端上实施,以使客户端能够响应特定事件。

此外,您可以通过向 Realtime 脚本添加游戏逻辑来自定义客户端和服务器的交互方式。借助自定义游戏逻辑,Realtime 可能会实施回调以触发事件驱动的响应。例如,当游戏客户端通知服务器已达到某个成就时,服务器会向其他游戏客户端发送一条消息,以提示发出公告。

通信协议

Realtime服务器与连接的游戏客户端之间的通信使用两个通道:用于可靠传递的 TCP 连接和用于快速传递的 UDP 通道。创建消息时,游戏客户端选择使用的协议取决于消息的性质。默认情况下,消息传递设置为 UDP。如果 UDP 通道未设置或不可用,则使用 TCP 作为后备发送所有消息。

消息内容

消息内容包含两种元素:必需的操作代码 (opCode) 和可选负载。消息的 opCode 标识特定的玩家活动或游戏事件,而负载根据需要提供与操作代码相关的附加数据。这两种元素都是开发人员定义的;即,您定义哪些操作映射到 opCode,以及是否需要消息负载。您的游戏客户端会根据它收到的消息中的操作码采取措施。

玩家组

实时服务器 提供管理玩家组的功能。默认情况下,连接到游戏的所有玩家均置于“所有玩家”组中。此外,开发人员可为其游戏设置其他组,而玩家可以同时是多个组的成员。组成员可以向组中的所有玩家发送消息或与组共享游戏数据。组的一种可能用途是建立玩家团队并管理团队沟通。

使用 实时服务器,服务器身份验证和数据包加密已内置在服务中,并且在您开启 TLS 证书生成时启用。当游戏客户端尝试与 Realtime 服务器连接时,服务器会自动使用客户端验证的 TLS 证书进行响应。加密是通过以下方式处理的:对于 TCP (Websocket) 通信使用 TLS,对于 UDP 流量使用 DTLS。

自定义Realtime服务器

就其最基本的形式而言,Realtime服务器表现为无状态中继服务器。Realtime 服务器在连接到游戏的游戏客户端之间中继消息和游戏数据包,但不评估消息、处理数据或执行任何游戏逻辑。以这种方式使用,每个游戏客户端均保持其自己的游戏状态的视图,并通过中继服务器向其他玩家提供更新。每个游戏客户端均负责合并这些更新并协调自己的游戏状态。

或者,您可以通过构建 Realtime 脚本功能来自定义服务器。有许多服务器端进程可供您选择实施,即使在利用 实时服务器 功能的简单性时也是如此。例如,对于游戏逻辑,您可选择使用游戏状态的服务器授权视图来构建有状态的游戏。

为 Realtime 脚本定义了一组服务器端回调。实施这些回调将事件驱动的功能添加到服务器。例如,您可以:

  • 当游戏客户端尝试连接到服务器时,对玩家进行身份验证。

  • 在请求时验证玩家是否可加入组。

  • 评估何时传递特定玩家或目标玩家的消息,或执行其他响应处理。

  • 当玩家离开小组或与服务器断开连接时,请采取措施,例如通知所有玩家。

  • 评估游戏会话对象或消息对象的内容并使用数据。

部署和更新 实时服务器

实时服务器 由 GameLift 的专用服务器资源提供支持。所提供的稳定性和安全性没有区别。就像对所有服务器一样,可以使用 GameLift 的对战和队列,通过 Fleet IQ 来尽可能减少延迟,这会根据玩家位置来优化游戏会话放置。

使用 GameLift 部署 实时服务器 游戏时,流程与在 GameLift 上部署传统游戏服务器的流程几乎相同。您可以创建计算资源队组并使用 Realtime 脚本部署它们,该脚本包含配置详细信息和可选的自定义逻辑。使用 GameLift,您可以选择要使用的队组类型,管理队组容量以及控制在队组上启动和运行游戏服务器进程的方式。Amazon GameLift 的工作原理中的游戏托管的详细描述表示使用 实时服务器 以及自定义游戏服务器托管的游戏。

实时服务器 的一个关键优势是能够随时更新您的脚本。您不需要创建新的队组来部署更新的脚本。更新脚本时,新版本将在几分钟内传播到所有托管资源。新脚本部署后,此后创建的所有新游戏会话都将使用新的脚本版本(现有游戏会话将继续使用原始版本)。