本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Amazon GameLift Servers添加到您的游戏服务器
本主题介绍如何修改游戏服务器代码,以便游戏服务器进程可以与Amazon GameLift Servers服务通信。对于计划部署到Amazon GameLift Servers托管 EC2 舰队、托管容器队列或 Anywhere 队列上的游戏服务器,请使用以下说明。
游戏服务器进程与Amazon GameLift Servers服务通信,以接收来自服务的指令并报告服务器进程运行状况和游戏会话状态。有关游戏托管解决方案组件(游戏服务器、后端服务、游戏客户端和Amazon GameLift Servers)之间交互的详细信息,请参阅与游戏客户端/服务器的互动 Amazon GameLift Servers。
要为托管游戏做好准备,请将适用于的服务器 SDK Amazon GameLift Servers 添加到您的游戏服务器项目中。如果你使用的是虚幻引擎或Unity的Amazon GameLift Servers插件,那么服务器SDK是内置的,随时可以使用。该服务器软件开发工具包支持多种语言。有关游戏服务器工具支持(包括服务器 SDK)的更多信息,请参阅获取Amazon GameLift Servers开发工具。
服务器软件开发工具包 API 参考:
初始化服务器进程
添加代码以与Amazon GameLift Servers服务建立通信并报告游戏服务器进程何时准备好托管游戏会话。此代码必须在任何Amazon GameLift Servers代码之前运行。
-
通过调用初始化 Amazon GameLift Servers API 客户端
InitSdk()
。如果你准备在Amazon GameLift Servers托管 EC2 队列上运行游戏服务器,请使用不带参数的默认InitSDK()
(C ++) (C#) (Unreal)。API 客户端会为您处理与Amazon GameLift Servers服务的连接。 -
通知服务游戏服务器进程已准备好托管游戏会话。使用以下
ProcessReady()
(C ++) (C++) (C#) (Unreal)ProcessParameters
。每个游戏服务器进程ProcessReady()
只能调用一次。-
服务器进程的端口号。当服务器进程启动游戏会话时,它会为服务提供端口,该Amazon GameLift Servers服务更新游戏会话信息。您的游戏可以检索此信息并将其提供给游戏客户端,游戏客户端使用这些信息连接到服务器进程并加入游戏会话。
-
您Amazon GameLift Servers要为您存储的文件的位置。这些文件可能包括游戏会话日志和服务器进程在游戏会话期间生成的其他文件。尽管这些文件会暂时Amazon GameLift Servers保存在运行服务器进程的计算机上,但这些文件只有在实例关闭之前才可用。您可以通过Amazon GameLift Servers控制台
或调用 Amazon GameLift Servers API 操作 GetGameSessionLogUrl() 来访问存储的文件。 如果您正在准备在Amazon GameLift Servers托管容器队列上使用的游戏服务器:
您无需为集装箱舰队指定日志参数。而是将游戏会话和其他日志数据发送到标准输出。容器队列会自动将所有容器标准输出捕获为日志流。
-
以下回调函数允许Amazon GameLift Servers向游戏服务器进程发送消息或提示。您必须在游戏服务器代码中实现所有这些函数。有关更多信息,请参阅
ProcessParameters
(C++)(C#)(Unreal)。-
(可选)
onHealthCheck
-定期Amazon GameLift Servers调用此函数向服务器请求运行状况报告。 -
onStartGameSession
— 响应客户端请求Amazon GameLift Servers调用此函数 CreateGameSession()。 -
onProcessTerminate
— Amazon GameLift Servers 强制服务器进程停止,使其正常关闭。 -
(可选)
onUpdateGameSession
— 向游戏服务器Amazon GameLift Servers提供更新的游戏会话对象或根据匹配回填请求提供状态更新。FlexMatch回填功能需要此回调。
-
您还可以设置游戏服务器,使其可以安全地访问您拥有或控制的其他 Amazon 资源。有关更多信息,请参阅 与舰队中的其他 Amazon 资源进行沟通。
-
报告服务器进程运行状况
向游戏服务器添加代码以实现回调函数onHealthCheck()
。 Amazon GameLift Servers定期调用此回调方法来收集运行状况指标。要实现此回调函数,执行以下操作:
-
评估服务器进程的运行状况。例如,如果任何外部依赖项失败,您可将服务器进程报告为不正常。
-
完成运行状况评估并在 60 秒内响应回调。如果在这段时间内Amazon GameLift Servers没有收到响应,它会自动认为服务器进程不健康。
-
返回布尔值:true 表示正常,false 表示不正常。
如果您未实现运行状况检查回调,则Amazon GameLift Servers认为服务器进程运行正常,除非服务器不响应。
该Amazon GameLift Servers服务使用服务器进程运行状况来结束不健康的进程并清理资源。如果服务器进程继续报告为运行状况不佳或连续三次运行状况检查没有响应,则该服务可能会关闭该进程并启动一个新的进程。该服务收集有关队列服务器进程运行状况的指标。
启动游戏会话
添加代码以实现回调函数onStartGameSession
。 Amazon GameLift Servers调用此回调以在服务器进程上启动游戏会话。
该onStartGameSession
函数将GameSession对象作为输入参数。此对象包含关键的游戏会话信息,例如最大玩家人数。它还可以包括游戏数据和玩家数据。函数实现应完成以下任务:
(可选)验证新玩家
如果您正在跟踪玩家会话的状态,请添加代码以在新玩家连接到游戏服务器时对其进行验证。 Amazon GameLift Servers跟踪当前玩家和可用的游戏会话插槽。
为了进行验证,尝试加入游戏会话的游戏客户端必须包含玩家会话 ID。 Amazon GameLift Servers当您的游戏通过调用 StartGameSessionPlacement() 或 StartMatchmaking() 开始新的游戏会话时生成此 ID。根据这些请求,将为玩家会话保留游戏会话中的空闲位置。
当游戏服务器进程收到游戏客户端连接请求时,它会使用玩家会话 ID 调用 AcceptPlayerSession()
(C++)(C#)(Unreal)。作为响应,Amazon GameLift Servers验证玩家会话 ID 是否对应于游戏会话中预留的空闲位置。Amazon GameLift Servers验证玩家会话 ID 后,服务器进程接受连接。然后,玩家可以加入游戏会话。如果Amazon GameLift Servers未验证玩家会话 ID,则服务器进程会拒绝连接。
报告玩家会话结束
如果您正在跟踪玩家会话的状态,请添加代码以在玩家离开游戏会话Amazon GameLift Servers时发出通知。每当服务器进程检测到连接断开时,都应运行此代码。 Amazon GameLift Servers使用此通知来跟踪游戏会话中的当前玩家和可用老虎机。
要处理代码中断的连接,请使用相应的玩家会话 ID 添加对服务器 API 操作 RemovePlayerSession()
) (C ++) (C#) (Unreal) 的调用。
结束游戏会话
向服务器进程关闭序列中添加代码,以便在游戏会话结束Amazon GameLift Servers时发出通知。要回收和刷新托管资源,请在游戏会话完成后关闭每个服务器进程。
在服务器进程关闭代码开始时,调用服务器 API 操作 ProcessEnding()
g(C++)(C#)(Unreal)。此调用Amazon GameLift Servers通知服务器进程正在关闭。 Amazon GameLift Servers将游戏会话状态和服务器进程状态更改为TERMINATED
。调用 ProcessEnding()
后,可以安全地关闭进程。
回应服务器进程关闭通知
添加用于关闭服务器进程的代码,以响应来自Amazon GameLift Servers服务的通知。当服务器进程持续报告运行状况不佳或服务器进程正在运行的实例被终止时,服务会发送此通知。 Amazon GameLift Servers可以作为容量缩减事件的一部分或为了响应 Spot 实例中断而停止实例。竞价型实例中断会提供两分钟的通知,这使服务器进程有时间优雅地断开玩家的连接、保留游戏状态数据和执行其他清理任务。
要处理关机通知,请对游戏服务器代码进行以下更改:
-
实现回调函数
onProcessTerminate()
(C ++) (C#) (Unreal)。此函数应调用关闭服务器进程的代码。 -
从游戏服务器关闭代码中调用服务器 API 操作
GetTerminationTime()
(C++)(C#)。如果Amazon GameLift Servers已发出停止服务器进程的调用,则GetTerminationTime()
返回估计的终止时间。 -
在游戏服务器关闭代码开始时,调用服务器 API 操作
ProcessEnding()
(C++)(C#)(Unreal)。此调用将通知 Amazon GameLift Servers 服务,服务器进程正在关闭。然后,该服务将服务器进程状态更改为TERMINATED
。调用ProcessEnding()
后,可以安全地关闭进程。