本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
游戏客户端/服务器与 Amazon 的互动 GameLift
Amazon GameLift 托管解决方案中的组件以特定的方式相互交互,从而根据玩家需求运行游戏会话。本主题介绍当您的游戏服务器托管在亚马逊托管队列、自我 GameLift 管理的 Amazon GameLift Anywhere EC2 队列或混合解决方案上时,组件如何相互通信。
托管解决方案组件包括游戏服务器、Amazon GameLift 服务、客户端后端服务和游戏客户端。游戏服务器使用亚马逊 GameLift 服务器SDK与亚马逊 GameLift 服务进行交互。后端服务使用 Amazon GameLift 服务 API(的一部分 AWS SDK)代表游戏客户端与服务进行交互。加入游戏会话时,游戏客户端使用游戏会话的唯一 IP 地址和端口号直接连接到游戏会话。
交互图
下图说明了您的游戏托管组件是如何交互的,这样 Amazon GameLift 服务就可以跟踪游戏服务器的可用性状态并根据玩家的需求启动游戏会话。
交互行为
以下各节描述了每个关键交互中的事件顺序。
初始化游戏服务器进程
启动时,游戏服务器进程会与 Amazon GameLift 服务建立通信,并将其状态报告为已准备好托管游戏会话。
-
游戏服务器可执行文件的新进程开始在托管资源上运行。
-
游戏服务器进程按顺序调用以下服务器SDK操作:
-
InitSDK()
初始化服务器SDK,对服务器进程进行身份验证,并与 Amazon GameLift 服务建立通信。 -
ProcessReady()
传达主持游戏会话的准备情况。此调用还会报告进程的连接信息、游戏客户端用来连接游戏会话以及其他信息。
然后,服务器进程会等待 Amazon GameLift 服务的提示。
-
-
Amazon 会将服务器进程的状态 GameLift 更新为
ACTIVE
并可用于托管新游戏会话。 -
Amazon GameLift 开始定期调用
onHealthCheck
回调,向服务器进程请求运行状态。当服务器进程保持活动状态时,这些调用会继续。服务器进程必须在一分钟内做出健康或不健康的响应。如果服务器进程响应不健康或没有响应,Amazon GameLift 服务会在某个时候更改服务器进程的活动状态并停止发送启动游戏会话的请求。
创建游戏会话
Amazon GameLift 服务会根据玩家的游戏请求启动新的游戏会话。
-
使用游戏客户端的玩家要求加入游戏会话。根据您的游戏处理玩家加入过程的方式,游戏客户端会向后端服务发送请求。
-
如果玩家加入过程需要开始新的游戏会话,则后端服务会向 Amazon GameLift 服务发送新游戏会话的请求。此请求调用服务API操作
StartGameSessionPlacement()
。(作为替代方案,后端服务可能会调用StartMatchmaking()
、或CreateGameSession()
。) -
Amazon GameLift 服务通过创建带有状态的新
GameSessionPlacement
票证来做出响应PENDING
。它将门票信息返回给后端服务,以便它可以跟踪排位票状态并确定游戏会话何时可供玩家使用。有关更多信息,请参阅 请参阅设置游戏会话置放通知。。 -
Amazon GameLift 服务启动游戏会话放置流程。它可以识别要查看哪些舰队,并在这些队列中搜索未托管游戏会话的活动服务器进程。在找到可用的服务器进程后,Amazon GameLift 服务会执行以下操作:
-
使用放置请求中的游戏会话设置和玩家数据创建
GameSession
对象,并将状态设置为ACTIVATING
。 -
提示服务器进程启动游戏会话。该服务调用服务器进程的
onStartGameSession
回调并传递对象。GameSession
-
将服务器进程的游戏会话数更改为
1
。
-
-
服务器进程运行其
onStartGameSession
回调函数。当服务器进程准备好接受玩家连接时,它会调用服务器SDK操作ActivateGameSession()
并等待玩家连接。 -
Amazon GameLift 服务使用服务器进程的连接信息(如调用中所述
ProcessReady()
)更新GameSession
对象,并将游戏会话状态设置为ACTIVE
。它还会将GameSessionPlacement
票证状态更新为FULFILLED
。 -
后端服务调用
DescribeGameSessionPlacement()
以检查票证状态并获取游戏会话信息。当游戏会话处于活动状态时,后端服务会通知游戏客户端并传递游戏会话连接信息。 -
游戏客户端使用连接信息直接连接到游戏服务器进程并加入游戏会话。
向游戏中添加玩家
游戏可以选择使用玩家会话来跟踪玩家与游戏会话的连接。玩家会话可以单独创建,也可以作为游戏会话放置请求的一部分创建。
-
后端服务使用游戏会话 ID 调
CreatePlayerSession()
用服务API操作。 -
Amazon GameLift 服务会检查游戏会话状态(必须是
ACTIVE
),并在游戏会话中寻找空闲的玩家位置。如果有插槽可用,则该服务会执行以下操作:-
创建新的
PlayerSession
对象并将其状态设置为RESERVED
。 -
使用玩家会话信息响应后端服务请求。
-
-
后端服务将玩家会话信息以及游戏会话连接信息传递给游戏客户端。
-
游戏客户端使用连接信息和玩家会话 ID 直接连接到游戏服务器进程并要求加入游戏会话。
-
为了响应游戏客户端的加入尝试,游戏服务器进程调用服务API操作
AcceptPlayerSession()
来验证玩家会话 ID。服务器进程接受或拒绝连接。 -
Amazon GameLift 服务会执行以下操作之一:
-
如果连接被接受,Amazon 会将
PlayerSession
状态 GameLift 设置为,ACTIVE
并将其传递PlayerSession
给游戏服务器进程。 -
如果游戏服务器进程在最初
CreatePlayerSession()
请求后的特定时间段内未调用AcceptPlayerSession()
玩家会话 ID,则 Amazon GameLift 服务会将PlayerSession
状态更改为TIMEDOUT
并重新打开游戏会话中的玩家位置。
-
移除玩家
对于使用玩家会话的游戏,当玩家断开连接时,游戏服务器进程会通知 Amazon GameLift 服务。该服务使用此信息来跟踪游戏会话中玩家老虎机的状态,并允许新玩家使用开放的老虎机。
-
玩家断开了与游戏会话的连接。
-
游戏服务器进程检测到连接丢失并调用服务器SDK操作
RemovePlayerSession()
。 -
Amazon GameLift 服务将玩家会话状态更改为
COMPLETED
并重新打开游戏会话中的玩家位置。
关闭游戏会话
在游戏会话结束或关闭游戏会话时,服务器进程会向 Amazon GameLift 服务通知游戏会话状态。
-
游戏服务器进程通过调用服务器SDK操作
ProcessEnding()
结束游戏会话并启动进程关闭。 -
Amazon GameLift 服务执行以下操作:
-
将游戏会话日志上传到 Amazon Simple Storage Service(Amazon S3)。
-
将游戏会话状态更改为
TERMINATED
。 -
更改服务器进程状态为
TERMINATED
。 -
根据托管解决方案的设计方式,将分配新可用的托管资源来运行新的游戏服务器进程。
-