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

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

亚马逊GameLift和游戏客户端服务器的互动

本主题介绍游戏客户端、后端服务、游戏服务器和 Amazon 之间的交互GameLift。

下图说明了游戏客户端、后端服务、亚马逊 GameLift SDK、托管 EC2 游戏服务器、亚马逊GameLift服务器 SDK 和亚马逊之间的交互GameLift。有关所示交互的详细描述,请参阅本页的以下部分。


            以下各节中列出的用例的游戏客户端/服务器交互。

初始化游戏服务器

以下步骤描述了在准备游戏服务器托管游戏会话时发生的交互。

  1. 亚马逊在亚马逊弹性计算云 (Amazon EC2) 实例上GameLift启动服务器可执行文件。

  2. 游戏服务器调用:

    1. InitSDK() 初始化服务器软件开发工具包。

    2. ProcessReady()传达游戏会话就绪情况、连接信息和游戏会话日志文件的位置。

    然后,服务器进程会等待来自亚马逊GameLift的回调。

  3. 亚马逊GameLift更新服务器进程的状态ACTIVE以启用游戏会话放置。

  4. 亚马逊GameLift开始调用onHealthCheck回调,并在服务器进程处于活动状态时继续定期调用。服务器进程可以在一分钟内报告运行状况良好或不运行状况。

创建游戏会话

初始化游戏服务器后,当您创建游戏会话来托管玩家时,会发生以下交互。

  1. 后端服务调用 SDK 操作StartGameSessionPlacement()

  2. 亚马逊GameLift创建具有状态的新GameSessionPlacement票证PENDING并将其返回给后端服务。

  3. 后端服务从队列中获取放置票状态。有关更多信息,请参阅为游戏会话放置设置事件通知

  4. 亚马逊通过选择合适的队列并在包含游戏会话的队列中搜索活跃的服务器进程来GameLift开始0游戏会话放置。当亚马逊GameLift找到服务器进程时,亚马逊GameLift会执行以下操作:

    1. 使用游戏会话设置和来自放置请求的玩家数据创建一个具有ACTIVATING状态的GameSession对象。

    2. 在服务器进程上onStartGameSession调用回调。亚马逊将信息GameLift传递给GameSession对象,表明服务器进程可以设置游戏会话。

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

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

  6. 亚马逊使用服务器进程的连接信息GameLift更新GameSession对象。(此信息包括报告的端口设置ProcessReady()。) 亚马逊GameLift还将状态更改为ACTIVE

  7. 后端服务调用DescribeGameSessionPlacement()以检测更新的票证状态。然后,后端服务使用连接信息将游戏客户端连接到服务器进程并加入游戏会话。

向游戏中添加玩家

此序列描述了将玩家添加到现有游戏会话的过程。也可以将玩家会话作为游戏会话放置请求的一部分进行请求。

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

  2. 亚马逊会GameLift检查游戏会话状态(必须是ACTIVE),并在游戏会话中寻找空闲的玩家位置。如果有空位可用,则亚马逊GameLift会执行以下操作:

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

    2. 使用PlayerSession对象响应后端服务请求。

  3. 后端服务使用玩家会话 ID 将游戏客户端直接连接到服务器进程。

  4. 服务器调用服务器 API 操作AcceptPlayerSession()来验证玩家会话 ID。如果经过验证,则亚马逊将PlayerSession对象GameLift传递给服务器进程。服务器进程接受或拒绝连接。

  5. 亚马逊GameLift会执行以下操作之一:

    1. 如果连接被接受,则亚马逊会将PlayerSession状态GameLift设置为ACTIVE

    2. 如果在后端服务器最初CreatePlayerSession()调用后的 60 秒内未收到任何响应,则亚马逊会将PlayerSession状态GameLift更改为TIMEDOUT并在游戏会话中重新打开玩家槽。

移除玩家

将玩家从游戏会话中移除以创造空间供新玩家加入时,会发生以下互动。

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

  2. 服务器检测到连接丢失并调用服务器 API 操作RemovePlayerSession()

  3. 亚马逊在游戏会话中将PlayerSession状态GameLift更改为COMPLETED并重新打开玩家位置。

关闭游戏会话

当服务器进程关闭当前游戏会话时,就会发生这种交互序列。

  1. 服务器关闭游戏会话和服务器。

  2. 服务器呼叫ProcessEnding()亚马逊GameLift。

  3. 亚马逊GameLift会做以下事情:

    1. 将游戏会话日志上传到亚马逊简单存储服务 (Amazon S3)。

    2. GameSession状态更改为TERMINATED

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

    4. 回收实例资源。