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

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

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

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

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

服务器 SDK API 参考资料:

初始化服务器进程

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

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

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

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

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

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

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

    注意

    要在亚马逊GameLift托管的 Amazon EC2 实例上初始化游戏服务器,请ServerParameters使用默认 InitSDK() (C#) (Unrea l) 构造函数(不带参数)构造你的。亚马逊为您GameLift设置计算环境并自动连接到亚马逊GameLift。

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

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

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

    • 亚马逊GameLift可以调用到您的服务器进程的回调函数的名称。你的游戏服务器必须实现这些功能。有关更多信息,请参见 (C ++) (C#) (虚幻)

      • (可选)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() al) (C ++) (C#) (U nreal)。作为回应,亚马逊GameLift会验证玩家会话 ID 是否与游戏会话中预留的空位相对应。亚马逊GameLift验证玩家会话 ID 后,服务器进程会接受连接。然后,玩家可以加入游戏会话。如果亚马逊GameLift未验证玩家会话 ID,则服务器进程会拒绝连接。

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

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

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

结束游戏会话

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

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

响应服务器进程关闭通知

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

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

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

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

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