将 Amazon GameLift 添加到您的游戏服务器 - Amazon GameLift
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

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

您的自定义游戏服务器必须与 Amazon 通信 GameLift,因为每个游戏服务器进程都必须能够响应 Amazon GameLift 启动的事件。您的游戏服务器还必须让 Amazon GameLift 随时了解服务器进程状态和玩家连接情况。有关您的游戏服务器、后端服务、游戏客户端和 Amazon 如何 GameLift 协同管理游戏托管的更多信息,请参阅Amazon GameLift 和游戏客户端服务器的互动

要让您的游戏服务器做好与亚马逊交互的准备 GameLift,请将 Amazon S GameLift erver SDK 添加到您的游戏服务器项目中,并构建本主题中描述的功能。该服务器软件开发工具包支持多种语言。有关 Amazon GameLift 服务器软件开发工具包的更多信息,请参阅Amazon 为开发提供支持 GameLift

服务器软件开发工具包 API 参考:

初始化服务器进程

添加代码以建立与 Amazon 的通信 GameLift 并报告服务器进程已准备好托管游戏会话。此代码必须在任何 Amazon GameLift 代码之前运行。

  1. 通过调用初始化亚马逊 GameLift API 客户端InitSdk()。要在 Amazon GameLift Anywhere 计算资源上初始化服务器进程,请InitSdk()使用以下方式调用ServerParameters

    • 用于连接游戏服务器的 WebSocket 网址。

    • 用于托管游戏服务器的进程的 ID。

    • 托管游戏服务器进程的计算的 ID。

    • 包含您的 Amazon GameLift Anywhere 计算的 GameLift 舰队的 ID。

    • Amazon GameLift 操作生成的授权令牌GetComputeAuthToken

  2. 通知 Amazon GameLift 服务器进程已准备好托管游戏会话。使用以下信息调用 ProcessReady() (C ++) (C++) (C#) (Unreal)。(请注意,每个服务器进程只能调用 ProcessReady() 一次)。

    • 服务器进程使用的端口号。后端服务向游戏客户端提供端口号和 IP 地址,用于连接到服务器进程并加入游戏会话。

    • 您希望 Amazon GameLift 保留的文件的位置,例如游戏会话日志。服务器进程在游戏会话期间生成这些文件。它们暂时存储在服务器进程正在运行的实例上,当实例关闭时,它们就会丢失。您列出的任何文件都将上传到 Amazon GameLift。您可以通过亚马逊 GameLift 控制台或调用 Amazon GameLift API 操作 GetGameSessionLogUrl() 来访问这些文件。

    • Amazon GameLift 可以调用到您的服务器进程的回调函数的名称。游戏服务器代码必须执行这些函数。有关更多信息,请参阅 (C++) (C#) (Unreal)

      • (可选)onHealthCheck— Amazon 定期 GameLift 调用此函数向服务器请求运行状况报告。

      • onStartGameSession— Amazon GameLift 调用此函数是为了响应客户请求 CreateGameSession()

      • onProcessTerminate— Amazon GameLift 强制服务器进程停止,让它优雅地关闭。

      • (可选)onUpdateGameSession— Amazon GameLift 向游戏服务器提供更新的游戏会话对象,或者根据匹配回填请求提供状态更新。FlexMatch 回填功能需要此回调。

    您也可以设置游戏服务器来安全地访问您拥有或控制的 Amazon 资源。有关更多信息,请参阅 与您的实例集中的其他 Amazon 资源进行通信

报告服务器进程运行状况

向游戏服务器添加代码以实现回调函数 onHealthCheck()。Amazon 会定期 GameLift 调用此回调方法来收集运行状况指标。要实现此回调函数,执行以下操作:

  • 评估服务器进程的运行状况。例如,如果任何外部依赖项失败,您可将服务器进程报告为不正常。

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

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

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

Amazon GameLift 使用服务器进程运行状况来结束不健康的进程并清理资源。如果服务器进程继续报告为运行状况不佳或连续三次运行状况检查没有响应,那么 Amazon GameLift 可能会关闭该进程并启动一个新的进程。Amazon GameLift 收集有关队列服务器进程运行状况的指标。

启动游戏会话

添加代码以实现回调函数 onStartGameSession。Amazon GameLift 调用此回调在服务器上启动游戏会话。

onStartGameSession函数将GameSession对象作为输入参数。此对象包含关键的游戏会话信息,例如最大玩家人数。它还可以包括游戏数据和玩家数据。函数实现应完成以下任务:

  • 启动操作以基于 GameSession 属性创建新的游戏会话。游戏服务器至少必须关联游戏会话 ID,游戏客户端在连接到服务器进程时会引用该会话 ID。

  • 根据需要处理游戏数据和玩家数据。这些数据在 GameSession 对象中。

  • GameLift 当新的游戏会话准备好接受玩家时,请通知 Amazon。调用服务器 API 操作 ActivateGameSession() (C++) (C#) (Unreal)。在成功调用后,Amazon 将游戏会话状态 GameLift 更改为ACTIVE

(可选)验证新玩家

如果您正在跟踪玩家会话的状态,请添加代码以在新玩家连接到游戏服务器时对其进行验证。Amazon 会 GameLift 跟踪当前玩家和可用的游戏会话老虎机。

为了进行验证,请求访问游戏会话的游戏客户端必须包含玩家会话 ID。当玩家要求使用 StartGameSessionPlacement() 或 StartMatchmaking() 加入游戏时,Amazon 会 GameLift 自动生成此 ID。然后,玩家会话将在游戏会话中保留空闲位置。

当游戏服务器进程收到游戏客户端连接请求时,它会使用玩家会话 ID 调用 AcceptPlayerSession() (C++) (C#) (Unreal)。作为回应,Amazon 会 GameLift 验证玩家会话 ID 是否与游戏会话中预留的空位相对应。Amazon GameLift 验证玩家会话 ID 后,服务器进程接受连接。然后,玩家可以加入游戏会话。如果 Amazon GameLift 未验证玩家会话 ID,则服务器进程会拒绝连接。

报告玩家会话结束

如果您正在跟踪玩家会话的状态,请添加代码以便在玩家离开游戏会话 GameLift 时通知 Amazon。只要服务器进程检测到断开的连接,此代码就应运行。Amazon GameLift 使用此通知来跟踪游戏会话中的当前玩家和可用老虎机。

要处理断开的连接,请在代码中添加对服务器 API 操作 RemovePlayerSession() (C++) (C#) (Unreal) 的调用,并附上相应的玩家会话 ID。

结束游戏会话

向服务器进程关闭序列中添加代码,以便在游戏会话结束 GameLift 时通知 Amazon。为了回收和刷新托管资源,Amazon 会在游戏会话完成后 GameLift 关闭服务器进程。

在服务器进程关闭代码开始时,调用服务器 API 操作 ProcessEnding() (C++) (C#) (Unreal).。此调用通知 Amazon GameLift 服务器进程正在关闭。Amazon 将游戏会话状态和服务器进程状态 GameLift 更改为TERMINATED。调用 ProcessEnding() 后,可以安全地关闭进程。

回应服务器进程关闭通知

添加代码以关闭服务器进程,以响应 Amazon 的通知 GameLift。当服务器进程持续报告运行状况不佳或服务器进程正在运行的实例被终止时,Amazon 会 GameLift 发送此通知。Amazon GameLift 可以在容量缩减事件中停止实例,或者为了响应 Spot 实例中断而停止实例。

要处理关机通知,请对游戏服务器代码进行以下更改:

  • 实现回调函数 onProcessTerminate()。此函数应调用用于关闭游戏服务器的代码。当 Amazon GameLift 调用此操作时,竞价型实例中断会在两分钟内发出通知。收到此调用后,服务器进程有五分钟的时间正常断开玩家连接、保留游戏状态数据和执行其他清除任务。

  • 从游戏服务器关闭代码中调用服务器 API 操作 GetTerminationTime() (C++) (C#)。如果 Amazon GameLift 已发出停止服务器进程的呼叫,则GetTerminationTime()返回预计的终止时间。

  • 在游戏服务器关闭代码开始时,调用服务器 API 操作 ProcessEnding() (C++) (C#) (Unreal)。此调用 GameLift 通知亚马逊服务器进程正在关闭, GameLift然后 Amazon 将服务器进程状态更改为。TERMINATED调用 ProcessEnding() 后,可以安全地关闭进程。