将 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 的交互

要将 Amazon GameLift 集成到您的游戏服务器中,请将 Amazon GameLift 软件开发工具包添加到游戏服务器项目并构建此主题介绍的功能。该服务器软件开发工具包支持多种语言。有关 Amazon GameLift 服务器软件开发工具包的更多信息,请参阅获取 Amazon GameLift 开发工具

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

初始化服务器进程

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

  1. 通过调用 InitSdk() 初始化 Amazon GameLift API 客户端。要初始化在 Amazon GameLift 托管式 EC2 实例上运行的游戏服务器进程,请使用不带参数的默认 InitSDK()C++)(C#)(Unreal。Amazon GameLift 会自动为您连接到 Amazon GameLift。

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

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

    • 您希望 Amazon GameLift 保留的文件的位置,例如游戏会话日志。服务器进程在游戏会话期间生成这些文件。它们暂时存储在服务器进程正在运行的实例上,当实例关闭时,它们就会丢失。您发布的所有文件都将上传到 Amazon GameLift 中。您可以通过 Amazon 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 对象中。

  • 当新的游戏会话准备好接受玩家时,通知 Amazon GameLift。调用服务器 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,则服务器进程会拒绝连接。

报告玩家会话结束

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

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

结束游戏会话

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

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

回应服务器进程关闭通知

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

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

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

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

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