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

添加 Amazon GameLift 到您的游戏服务器

您的游戏服务器在部署之后需要与 Amazon GameLift 服务交互,并且在 Amazon GameLift 队组上作为多个服务器进程运行。您通过添加代码,使每个服务器进程与 Amazon GameLift 服务通信。服务器进程必须能够响应由 Amazon GameLift 服务触发的特定事件,并保持 Amazon GameLift 了解玩家活动和服务器进程状态。请查看 Amazon GameLift 交互的完整说明。

使用您首选语言的 Amazon GameLift Server 开发工具包将 Amazon GameLift 功能添加到您的游戏服务器。有关更完整的信息,请参阅以下服务器 API 参考。

要将 Amazon GameLift 集成到您的游戏服务器中,请将 Amazon GameLift Server 开发工具包添加到游戏服务器项目并构建此主题介绍的功能。

准备服务器进程

添加代码以初始化 Amazon GameLift 客户端,并通知 Amazon GameLift 服务,服务器已准备好托管游戏会话。此代码应在任何依赖于 Amazon GameLift 的代码之前自动运行,例如在启动时。

注意

服务器 API 操作名称在所有可用语言中都是相同的。

  1. 初始化服务器开发工具包。调用 InitSdk()

  2. 通知 Amazon GameLift,游戏服务器进程已准备好托管游戏会话。Amazon GameLift 实例上启动的每个服务器进程必须使用以下信息调用 ProcessReady()

    • 服务器进程使用的端口号。此端口号和 IP 地址存储在游戏会话对象中,供游戏客户端在连接到活动游戏会话时使用。

    • 您希望 Amazon GameLift 将活动游戏会话中生成的文件 (例如游戏会话日志) 保存到的位置。托管游戏会话时,服务器进程生成的文件将保存到 Amazon GameLift 实例,但这些文件将在实例关闭时丢失。Amazon GameLift 将上传您请求的这些文件中的任意文件;上传之后,可通过 Amazon GameLift 控制台或通过调用 Amazon GameLift API GetGameSessionLogUrl() 来访问这些文件。如果您的队组配置为每个实例运行多个并发服务器进程,请考虑使用唯一标识游戏会话的文件命名方案。

    • Amazon GameLift 用于在服务器进程上触发特定操作的回调函数的名称。下列各节以及 ProcessParameters 中提供了有关实施这些函数的更多信息。

      • 将定期调用 onHealthCheck (必需) 以从服务器进程请求运行状况报告。

      • 当 Amazon GameLift 服务收到启动新游戏会话的请求 (CreateGameSession()) 时调用 onStartGameSession(必需)。

      • 当 Amazon GameLift 服务需要强制服务器进程终止时,将调用 onProcessTerminate(必需),以允许服务器进程正常关闭。

      • 当 Amazon GameLift 服务向游戏服务器交付更新后的游戏会话对象或根据对战回填请求提供状态更新时,将调用 onUpdateGameSession(可选)。仅当您使用的是 FlexMatch 回填功能时,需要此回调。在在游戏服务器上更新对战数据处了解如何实现此回调函数。

    根据您如何配置队组,队组实例上可能会有多个服务器进程并发运行。一旦实例上的一个服务器进程成功调用 ProcessReady(),Amazon GameLift 服务会将该实例的状态设置为 ACTIVE。

报告服务器进程运行状况

添加代码以实现回调函数 onHealthCheck()。此函数由 Amazon GameLift 服务定期调用,以收集来自服务器进程的运行状况指标。服务器进程以两个值来响应运行状况检查:“正常”或“不正常”。实现此回调函数时,执行以下操作:

  • 使用对您游戏有用的任何方式来评估服务器进程的状态。例如,如果任何外部依赖项失败,或者内存容量等指标低于定义的限制,您可将服务器进程报告为不正常。

  • 完成运行状况评估并在 60 秒内响应回调。如果 Amazon GameLift 服务未在该时间内收到响应,它会自动将服务器进程视为不正常。

  • 返回布尔值:true 表示正常,false 表示不正常。

如果您未实现运行状况检查回调,Amazon GameLift 服务会将服务器进程视为正常;如果进程未响应,则将进程视为不正常。

服务器进程运行状况由 Amazon GameLift 用来有效地结束不正常进程和释放资源。如果某个服务器进程在三次连续的运行状况检查中持续报告不正常或不响应,Amazon GameLift 服务可能会关闭该进程然后启动新进程。可以在 Amazon GameLift 控制台上收集和查看队组的服务器进程运行状况指标。

启动游戏会话

添加代码以实现回调函数 onStartGameSession。此函数由 Amazon GameLift 服务在创建新游戏会话时调用,在响应 CreateGameSession() 请求、游戏会话放置的过程中或者对战活动中可能出现这种情况。

onStartGameSession 函数采用由 Amazon GameLift 服务提供的 GameSession 对象作为输入参数。此对象包含定义所请求游戏会话的游戏会话 ID 和其他信息。函数应完成以下任务:

  • 执行任何需要的操作以创建新的游戏会话。新游戏会话应体现 GameSession 对象,包括为所指定最大数量的玩家创建玩家位置以及引用游戏会话名称和 ID。Amazon GameLift 服务提供相同的游戏会话信息到游戏客户端。

  • 处理游戏客户端在其请求中指定的游戏属性值。游戏属性包含在 GameSession 对象中。

  • 在新游戏会话已经准备好接受玩家的某个时刻,服务器进程必须调用服务器 API 操作 ActivateGameSession()。作为对成功调用的响应,Amazon GameLift 服务将游戏会话状态更改为 ACTIVE。

验证新玩家

添加代码以验证玩家与 Amazon GameLift 服务的连接请求。只要有新玩家尝试连接到服务器进程,就应在接受连接之前运行此代码。

来自游戏客户端的连接请求必须引用玩家会话 ID。此 ID 由 Amazon GameLift 服务发出,用于在游戏会话中保留玩家位置(响应 AWS 开发工具包对 CreatePlayerSession() 的调用)。游戏服务器必须使用引用的玩家会话 ID 调用 AcceptPlayerSession(),以验证连接请求是否来自授权玩家。

一旦玩家 ID 通过了 Amazon GameLift 服务的验证,服务器进程即可接受连接并允许玩家加入游戏会话。如果玩家会话 ID 未通过 Amazon GameLift 服务的验证,则服务器进程应拒绝相应的连接。

要获取与游戏会话关联的玩家数据,请调用 DescribePlayerSessions()

报告玩家会话结束

添加代码,在玩家从游戏会话断开连接时通知 Amazon GameLift 服务。只要服务器进程检测到断开的连接,此代码就应运行。

在用于处理断开的连接的代码中,添加对服务器 API 操作 RemovePlayerSession() 的调用,该调用使用与断开的连接关联的玩家会话 ID。此通知使得 Amazon GameLift 服务可以准确跟踪当前玩家数量以及游戏会话中可用的玩家位置。

停止游戏会话

添加代码,以在游戏会话结束时通知 Amazon GameLift 服务。通知使得 Amazon GameLift 服务可以准确跟踪新游戏会话的服务器进程可用性。此代码应添加到普通游戏会话结束进程中。

在停止游戏会话的代码末尾处,添加对服务器 API 操作 TerminateGameSession() 的调用。成功收到此通知后,Amazon GameLift 服务将游戏会话状态更改为 TERMINATED 并可立即启动新游戏会话。

注意

如果停止游戏会话后面将紧跟关闭服务器进程,您可以调用服务器 API 操作 ProcessEnding(),这会终止游戏会话和服务器进程。

关闭服务器进程

关闭可以由服务器进程启动或由 Amazon GameLift 服务发起。对您的游戏服务器代码进行以下更改以处理任一场景。

  • 实现回调函数 onProcessTerminate()。此函数应调用用于关闭游戏服务器的代码。Amazon GameLift 服务将调用此函数以发起服务器进程关闭 - 通常在终止正在运行服务器进程的实例之前。进行此调用的情况包括:Amazon GameLift 关闭运行状况不佳的服务器进程, Spot 实例中断或实例容量缩减。在收到此调用后,服务器进程通常有几分钟 (在 Spot 实例终止时为两分钟) 的时间来正常断开玩家的链接,保存游戏状态数据和执行其他清理任务。

  • 从游戏服务器关闭代码调用服务器 API 操作 GetTerminationTime()。如果 Amazon GameLift 已发出终止服务器进程的调用,则 GetTerminationTime() 将返回预计终止时间(如果可用)。您可以使用此信息来确定哪些关闭活动可以在剩余的时间内完成,例如保存游戏状态或将玩家迁移到新的游戏会话。

  • 在游戏服务器关闭代码的开头,调用服务器 API 操作 ProcessEnding()。此调用将通知 Amazon GameLift 服务,该服务器进程正在关闭。在收到此通知时,Amazon GameLift 服务会将服务器进程状态更改为 TERMINATED 并可能根据需要立即回收实例的资源。这还将确保新的游戏会话发送到该进程。在 ProcessEnding() 调用后,该进程便可以安全地关闭。