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

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

将亚马逊 GameLift 添加到您的游戏服务器

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

要让您的游戏服务器做好与亚马逊交互的准备 GameLift,请将 Amazon S GameLift erver SDK 添加到您的游戏服务器项目中,并内置本主题中描述的功能。Server SDK 可在多个语言中使用。有关亚马逊 GameLift 服务器 SDK 的更多信息,请参阅下载亚马逊 GameLift SDK

服务器 SDK API 参考资料:

初始化服务器进程

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

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

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

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

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

    • 包含您的亚马逊 GameLift Anywhere计算的 GameLift 队列的 ID。

    • 亚马逊 GameLift 操作生成的授权令牌GetComputeAuthToken

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

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

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

    • 亚马逊 GameLift 可以调用您的服务器进程的回调函数的名称。您的游戏服务器必须实现这些功能。有关更多信息,请参阅ProcessParameters

      • (可选)onHealthCheck— 亚马逊定期 GameLift 调用此函数以请求服务器提供健康状态报告。

      • onStartGameSession— 亚马逊 GameLift 调用此函数以响应客户请求 CreateGameSession()

      • onProcessTerminate— 亚马逊 GameLift 强制服务器进程停止,让它正常关闭。

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

    您还可以设置游戏服务器以安全地访问您拥有或控制的Amazon资源。有关更多信息,请参阅与舰队中的其他Amazon资源通信

(可选)报告服务器进程运行状况

向游戏服务器添加代码以实现回调函数onHealthCheck()。亚马逊定期 GameLift 调用此回调方法来收集健康指标。要实现此回调函数,请执行以下操作:

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

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

  • 返回布尔值:正常 true,不健康则返回 false。

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

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

开始游戏会话

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

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

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

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

  • GameLift 当新的游戏会话准备好接受玩家时,通知亚马逊。调用服务器 API 操作ActivateGameSession() (C#) (C ++)(虚幻)。为了响应成功的呼叫,亚马逊将游戏会话状态 GameLift 更改为ACTIVE

(可选)验证新玩家

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

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

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

(可选)报告玩家会话结束

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

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

结束游戏会话

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

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

回应服务器进程关闭通知

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

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

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

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

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