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

实时服务器 的工作原理

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

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

虽然 Amazon GameLift 非常适合托管具有很多详细游戏逻辑的完全自定义的游戏服务器,但有很多多人游戏类型不需要这种复杂性。对于这些游戏,实时服务器 为玩家提供了简化的途径来启动和运行游戏。实时服务器 无需开发、测试和部署自定义的游戏服务器;而是使用 Realtime Server,其内置了核心游戏服务器基础设施,游戏开发人员可以避免大量的工作。同时, Realtime Server 可以灵活地集成自定义游戏逻辑。

对于不依赖复杂计算游戏和不需要硬件密集型游戏服务器的游戏,实时服务器 是一个不错的选择。使用 实时服务器 以实现最佳效果的游戏包括轻量级游戏或管理游戏客户端上大部分计算工作的游戏。示例包括消息传递游戏、回合制策略游戏和许多类型的移动游戏。对某些玩家延迟容忍度极低的游戏(例如,第一人称射击游戏和其他快速动作游戏),最好使用可靠的自定义游戏服务器,虽然 Amazon GameLift FleetIQ 可帮助尽可能减少所有类型游戏服务器的延迟。

关键组件

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

  • Realtime服务器为多人游戏提供基本的联网功能。它预先配备了与 Amazon GameLift 服务交互所需的功能,以便托管游戏会话和玩家。它允许玩家彼此通信并交换信息以保持同步的游戏状态。它还保持与 Amazon GameLift 服务通信以启动和停止游戏、验证玩家和报告游戏运行状态。Amazon GameLift 将实时服务器部署到您的虚拟计算资源以进行托管。

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

  • Realtime 脚本为游戏提供自定义的游戏逻辑。该脚本可能涉及最少的配置设置或较复杂的游戏逻辑。Realtime 脚本与 Realtime 服务器一起部署到托管资源。脚本用基于 Node.js 的 JavaScript 编写。

  • Amazon GameLift 服务管理托管 Realtime Server 所需的计算资源,并将玩家连接到游戏。它控制玩家需要的资源数,触发游戏会话启动和停止,并通过在活动的游戏会话中查找和预留玩家位置来处理玩家加入请求。该服务还收集有关 Realtime Server 运行状况和玩家使用情况的性能数据。

  • 游戏会话由在托管资源上运行的 Realtime Server 和脚本的实例托管。玩家连接到游戏会话来与其他玩家一起玩游戏和交互。

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

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

要托管游戏会话,您需要设置托管资源队组来运行 Realtime Server 并配置服务器如何托管游戏会话。Amazon GameLift 管理托管资源的核心功能(包括使用自动扩展管理队组容量)可用于 实时服务器。

游戏服务器与 Amazon GameLift 服务通信所需的所有功能均内置于 Realtime Server。Realtime Server 响应来自 Amazon GameLift 的触发器来开始新游戏会话,并提供对附带游戏数据或玩家数据(如对战数据)的访问权限。当游戏使用玩家会话预留游戏位置或验证玩家连接时,Realtime 服务器会在玩家连接时对其进行验证。Realtime 服务器将其运行状况重新报告给 Amazon GameLift 服务,报告游戏会话何时结束,并响应来自 Amazon GameLift 的提示来在需要时强制游戏会话终止。

您也可以向 Realtime 服务器添加自定义逻辑,方法是将其构建到 Realtime 脚本内。访问服务器特定的对象,包括消息内容和游戏会话对象。使用回调添加事件驱动的逻辑,如在游戏会话开始或结束时触发活动。根据非事件场景添加逻辑,如计时器或状态检查。

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

在游戏会话期间,游戏客户端之间的交互由消息收发完成。消息通过Realtime服务器发送和接收。游戏客户端使用消息来与游戏中的其他游戏客户端交换活动、游戏状态和相关的游戏数据。Realtime 服务器也可接收消息,如触发 Realtime 脚本中的游戏逻辑,以及向游戏客户端发起消息。

游戏客户端通过 Realtime 客户端开发工具包进行通信,后者集成到游戏客户端中。客户端开发工具包定义了一组同步 API 调用,使得客户端可以连接到游戏、发送消息以及断开与游戏的连接。它还定义了一组异步回调,可在游戏客户端上实施,使客户端能够响应特定事件。

Realtime 服务器在客户端之间自动传递消息。此外,可以使用额外的游戏逻辑来自定义 Realtime 脚本,如使用回调来定义事件驱动的响应。

通信协议

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

消息内容

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

玩家组

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

自定义Realtime服务器

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

或者,您可以通过构建 Realtime 脚本功能来自定义服务器。最简单的中继服务器只需要一个最小的 Realtime 脚本,它允许所有消息和所有请求顺利地传递。但是,有许多服务器端进程可供您选择实施,即使在利用 实时服务器 功能的简化性时也是如此。例如,对于游戏逻辑,您可选择使用游戏状态的服务器授权视图来构建有状态的游戏。

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

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

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

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

  • 在玩家离开某个组或断开与服务器的连接时采取其他措施。

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

部署和更新 实时服务器

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

使用 Amazon GameLift 部署 实时服务器 游戏时,流程与在 Amazon GameLift 上部署传统游戏服务器的流程几乎相同。您可以创建计算资源的队组,并使用 Realtime 脚本而不是自定义游戏生成包进行部署。您可控制如何在您的队组上启动和运行服务器进程,并可根据需要管理队组容量。Amazon GameLift 的工作原理中的游戏托管详细描述准确地表述了使用 实时服务器 托管的工作原理。

实时服务器 带来的额外优势的主要区别在于,与自定义游戏服务器生成包不同,Realtime 脚本可以随时更新,而无需部署新队组。更新脚本时,新脚本将在几分钟内传播到所有托管资源。新脚本部署后,此后创建的所有新游戏会话都将使用新的脚本版本(现有游戏会话将继续使用其原始版本)。