游戏客户端/服务器与 Amazon GameLift 的交互 - Amazon GameLift

游戏客户端/服务器与 Amazon GameLift 的交互

Amazon GameLift 托管解决方案中的组件以特定的方式相互交互,从而根据玩家需求运行游戏会话。本主题介绍当游戏服务器托管在 Amazon GameLift 托管式 EC2 实例集、自管理式 Amazon GameLift Anywhere 实例集或混合解决方案上时,各组件之间如何相互通信。

托管解决方案组件包括游戏服务器、Amazon GameLift 服务、客户端后端服务和游戏客户端。游戏服务器使用 Amazon GameLift 服务器 SDK 与 Amazon GameLift 服务交互。后端服务使用 Amazon GameLift 服务 API(AWS SDK 的一部分)代表游戏客户端与该服务交互。加入游戏会话时,游戏客户端使用游戏会话的唯一 IP 地址和端口号直接连接到游戏会话。

交互示意图

下图说明了游戏托管组件如何交互,让 Amazon GameLift 服务可以跟踪游戏服务器可用性状态并根据玩家需求启动游戏会话。

关键交互的游戏客户端/服务器行为,如本主题所述。

交互行为

以下各节介绍了各个关键交互中的事件顺序。

初始化游戏服务器进程

启动时,一个游戏服务器进程会与 Amazon GameLift 服务建立通信,并将其状态报告为已准备好托管游戏会话。

  1. 游戏服务器可执行文件的新进程开始在托管资源上运行。

  2. 游戏服务器进程按顺序调用以下服务器 SDK 操作:

    1. InitSDK(),用于初始化服务器 SDK、对服务器进程进行身份验证以及与 Amazon GameLift 服务建立通信。

    2. ProcessReady(),用于传达已准备好托管游戏会话。此调用还会报告进程的连接信息(游戏客户端用来连接到游戏会话)以及其他信息。

    然后,服务器进程会等待 Amazon GameLift 服务的提示。

  3. Amazon GameLift 将服务器进程的状态更新为 ACTIVE,可用于托管新游戏会话。

  4. Amazon GameLift 开始定期调用 onHealthCheck 回调,从服务器进程请求运行状况。这些调用在服务器进程保持活动状态期间会持续。服务器进程必须在一分钟内响应运行状况是否正常。如果服务器进程响应运行状况不正常或没有响应,Amazon GameLift 服务就会在某个时间点更改服务器进程的活动状态,并停止发送启动游戏会话的请求。

创建游戏会话

Amazon GameLift 服务会根据玩家的游戏请求启动新游戏会话。

  1. 一位使用游戏客户端的玩家请求加入游戏会话。根据您的游戏处理玩家加入流程的方式,游戏客户端会向后端服务发送请求。

  2. 如果玩家加入流程要求启动新游戏会话,后端服务会向 Amazon GameLift 服务发送新游戏会话的请求。此请求将调用服务 API 操作 StartGameSessionPlacement()。(作为替代方案,后端服务可能会调用 StartMatchmaking()CreateGameSession()。)

  3. Amazon GameLift 服务以创建一个状态为 PENDING 的新 GameSessionPlacement 票证作为响应。它会将票证信息返回到后端服务,让后端服务可以跟踪放置票证状态和确定游戏会话何时可供玩家加入。有关更多信息,请参阅请参阅设置游戏会话置放通知。

  4. Amazon GameLift 服务启动游戏会话放置流程。它会确定要查看的实例集,并在这些实例集中搜索未托管游戏会话的活动服务器进程。在找到可用的服务器进程后,Amazon GameLift 服务会执行以下操作:

    1. 使用游戏会话设置和来自放置请求的玩家数据创建 GameSession 对象,并将状态设置为 ACTIVATING

    2. 提示服务器进程启动游戏会话。该服务将调用服务器进程的 onStartGameSession 回调并传递 GameSession 对象。

    3. 将服务器进程的游戏会话数更改为 1

  5. 服务器进程运行其 onStartGameSession 回调函数。当准备好接受玩家连接时,服务器进程将调用服务器 SDK 操作 ActivateGameSession() 并等待玩家连接。

  6. Amazon GameLift 服务使用服务器进程的连接信息更新 GameSession 对象(如对 ProcessReady() 的调用中所报告的那样),并将游戏会话状态设置为 ACTIVE。它还会将 GameSessionPlacement 票证状态更新为 FULFILLED

  7. 后端服务调用 DescribeGameSessionPlacement() 来检查票证状态并获取游戏会话信息。当游戏会话处于活动状态时,后端服务会通知游戏客户端并传递游戏会话连接信息。

  8. 游戏客户端使用连接信息直接连接到游戏服务器进程并加入游戏会话。

向游戏中添加玩家

游戏可以选择使用玩家会话来跟踪玩家与游戏会话的连接。玩家会话可以单独创建,也可以作为游戏会话放置请求的一部分创建。

  1. 后端服务使用游戏会话 ID 调用服务 API 操作 CreatePlayerSession()

  2. Amazon GameLift 服务检查游戏会话状态(必须为 ACTIVE)并在游戏会话中查找开放的玩家位置。如果有可用位置,该服务将执行以下操作:

    1. 创建新的 PlayerSession 对象并将其状态设置为 RESERVED

    2. 使用玩家会话信息响应后端服务请求。

  3. 后端服务将玩家会话信息和游戏会话连接信息一起传递给游戏客户端。

  4. 游戏客户端使用连接信息和玩家会话 ID 直接连接到游戏服务器进程并请求加入游戏会话。

  5. 为了响应游戏客户端的加入尝试,游戏服务器进程调用服务 API 操作 AcceptPlayerSession() 来验证玩家会话 ID。服务器进程接受或拒绝连接。

  6. Amazon GameLift 服务执行以下操作之一:

    1. 如果连接被接受,Amazon GameLift 会将 PlayerSession 状态设置为 ACTIVE 并将 PlayerSession 传递到游戏服务器进程。

    2. 如果游戏服务器进程在最初的 CreatePlayerSession() 请求发出后的一段时间内没有为玩家会话 ID 调用 AcceptPlayerSession(),Amazon GameLift 服务就会将 PlayerSession 状态更改为 TIMEDOUT,并在游戏会话中重新开放玩家位置。

删除玩家

对于使用玩家会话的游戏,当有玩家断开连接时,游戏服务器进程会通知 Amazon GameLift 服务。该服务使用此信息来跟踪游戏会话中玩家位置的状态,并可以允许新玩家使用开放的位置。

  1. 玩家断开与游戏会话的连接。

  2. 游戏服务器进程检测到丢失的连接并调用服务器 SDK 操作 RemovePlayerSession()

  3. Amazon GameLift 服务将玩家会话状态更改为 COMPLETED,并在游戏会话中重新开放玩家位置。

关闭游戏会话

在游戏会话结束或关闭游戏会话时,服务器进程会向 Amazon GameLift 服务通知游戏会话状态。

  1. 游戏服务器进程通过调用服务器 SDK 操作 ProcessEnding() 结束游戏会话并启动进程关闭。

  2. Amazon GameLift 服务执行以下操作:

    1. 将游戏会话日志上传到 Amazon Simple Storage Service(Amazon S3)。

    2. 将游戏会话状态更改为 TERMINATED

    3. 更改服务器进程状态为 TERMINATED

    4. 根据托管解决方案的设计,分配新的可用托管资源来运行新的游戏服务器进程。