本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用Amazon GameLift Servers本地测试您的集成
注意
本主题仅介绍与服务器 SDK 集成的游戏(仅适用于 3.x 和 4.x Amazon GameLift Servers 版本)的测试。您的服务器 SDK 包包含兼容版本的 L Amazon GameLift Servers ocal。如果你使用的是服务器 SDK 版本 5.x,请参阅使用服务器 SDK 5.x 进行本地测试,了解如何使用 Amazon GameLift Servers Anywh GameLift er e 队列进行本地测试。有关从 SDK 4.x 迁移到 5.x 的指南,请参阅迁移到 GameLift 服务器 SDK 5.x。
使用 Amazon GameLift Servers Local 可以在本地设备上运行托管 Amazon GameLift Servers 服务的有限版本,并在其上测试您的游戏集成。此工具在对您的游戏集成进行迭代开发时非常有用。另一种方法——将每个新版本上传到Amazon GameLift Servers并配置一个队列来托管你的游戏——每次可能需要几次或更多时间。
通过 Amazon GameLift Servers Local,您可以验证以下内容:
-
您的游戏服务器与服务器开发工具包正确集成,并且正确与 Amazon GameLift Servers 服务通信,可启动新游戏会话、接受新玩家和报告运行状况及状态。
-
您的游戏客户端已与 AWS 适用于 SDK 正确集成,Amazon GameLift Servers并且能够检索有关现有游戏会话的信息、开始新的游戏会话、让玩家加入游戏以及连接到游戏会话。
Amazon GameLift ServersLocal 是一种命令行工具,用于启动托管服务的独立版本。Amazon GameLift Servers Amazon GameLift ServersLocal 还提供服务器进程初始化、运行状况检查以及 API 调用和响应的运行事件日志。 Amazon GameLift ServersLocal 可以识别的 AWS SDK 操作的子集Amazon GameLift Servers。您可以从 AWS CLI 或从您的游戏客户端拨打电话。在本地执行的所有 API 操作与在 Amazon GameLift Servers Web 服务上执行时完全一样。
每个服务器进程只能托管一个游戏会话。游戏会话是您用来连接到 L Amazon GameLift Servers ocal 的可执行文件。游戏会话完成后,您应该调用GameLiftServerSDK::ProcessEnding
然后退出该进程。使用 L Amazon GameLift Servers ocal 进行本地测试时,可以启动多个服务器进程。每个进程都将连接到Amazon GameLift Servers本地。然后,您可以为每个服务器进程创建一个游戏会话。当您的游戏会话结束时,您的游戏服务器进程应该退出。然后,必须手动启动另一个服务器进程。
Amazon GameLift Serverslocal 支持以下内容 APIs:
-
CreateGameSession
-
CreatePlayerSession
-
CreatePlayerSessions
-
DescribeGameSessions
-
DescribePlayerSessions
设置Amazon GameLift Servers本地
Amazon GameLift Servers Local 作为与.jar
服务器开发工具包捆绑的可执行
在运行 Local 之前,您还必须已安装以下各项。
-
适用于 3.1.5 到 4.x Amazon GameLift Servers 版本的服务器 SDK 的版本。
-
Java 8
测试游戏服务器
如果您只想测试游戏服务器,则可以使用 AWS CLI 来模拟游戏客户端对Amazon GameLift Servers本地服务的调用。这将验证您的游戏服务器是否按预期执行以下操作:
-
游戏服务器可以正常启动并初始化服务器 SDK。Amazon GameLift Servers
-
在启动过程中,游戏服务器通知 Amazon GameLift Servers,服务器已准备好托管游戏会话。
-
在运行时,游戏服务器每分钟将运行状况发送到 Amazon GameLift Servers。
-
游戏服务器响应请求,启动新游戏会话。
-
启动 Amazon GameLift Servers Local。
打开命令提示符窗口,导航到包含
文件的目录并运行它。默认情况下,Local 在端口 8080 上侦听来自游戏客户端的请求。要指定不同的端口号,请使用GameLiftLocal.jar
-p
参数,如以下示例所示:java -jar GameLiftLocal.jar -p 9080
Local 启动之后,您可以查看日志,其中指示两个本地服务器已启动,一个列出您的游戏服务器,另一个列出您的游戏客户端或 AWS CLI。日志继续报告两个本地服务器上的活动,包括往返于游戏组件之间的通信。
-
启动游戏服务器。
在本地启动您的 Amazon GameLift Servers 集成游戏服务器。您无需更改游戏服务器的终端节点。
在 Local 命令提示符窗口中,日志消息指示您的游戏服务器已连接至 Amazon GameLift Servers Local 服务。这意味着您的游戏服务器已成功初始化 Amazon GameLift Servers (with
InitSDK()
) 的服务器 SDK。它使用所示的日志路径调用ProcessReady()
,如果成功,则已准备好托管游戏会话。在游戏服务器运行期间,Amazon GameLift Servers 记录来自各游戏服务器的各个运行状况报告。以下日志消息示例显示了成功集成的游戏服务器:16:50:53,217 INFO || - [SDKListenerImpl] nioEventLoopGroup-3-1 - SDK connected: /127.0.0.1:64247 16:50:53,217 INFO || - [SDKListenerImpl] nioEventLoopGroup-3-1 - SDK pid is 17040, sdkVersion is 3.1.5 and sdkLanguage is CSharp 16:50:53,217 INFO || - [SDKListenerImpl] nioEventLoopGroup-3-1 - NOTE: Only SDK versions 3.1.5 and above are supported in GameLiftLocal! 16:50:53,451 INFO || - [SDKListenerImpl] nioEventLoopGroup-3-1 - onProcessReady received from: /127.0.0.1:64247 and ackRequest requested? true 16:50:53,543 INFO || - [SDKListenerImpl] nioEventLoopGroup-3-1 - onProcessReady data: logPathsToUpload: "C:\\game\\logs" logPathsToUpload: "C:\\game\\error" port: 1935 16:50:53,544 INFO || - [HostProcessManager] nioEventLoopGroup-3-1 - Registered new process true, true, 16:50:53,558 INFO || - [SDKListenerImpl] nioEventLoopGroup-3-1 - onReportHealth received from /127.0.0.1:64247 with health status: healthy
潜在的错误和警告消息包括以下内容:
-
错误:“ProcessReady 未找到 PID 为:!的进程
<process ID>
是否已调用 InitSDK()?” -
警告:“PID 为:! 的进程的进程状态已经存在
<process ID>
ProcessReady(...) 是否多次被调用?”
-
-
启动 AWS CLI.
在您的游戏服务器成功调用
ProcessReady()
之后,您可以开始进行客户端调用。打开另一个命令提示符窗口并启动 AWS CLI 工具。 AWS CLI 默认情况下,使用 Amazon GameLift Servers Web 服务端点。您必须在使用--endpoint-url
参数的每个请求中,使用 Local 终端节点覆盖此项,如以下示例请求中所示。AWS gamelift describe-game-sessions --endpoint-url http://localhost:9080 --fleet-id fleet-123
在 AWS CLI 命令提示符窗口中,
AWS gamelift
命令会产生响应,如AWS CLI 命令参考中所述。 -
创建游戏会话。
使用 AWS CLI,提交 CreateGameSession() 请求。该请求应采用预期的语法。对于 Local,
FleetId
参数可以设置为任意有效字符串 (^fleet-\S+
)。AWS gamelift create-game-session --endpoint-url http://localhost:9080 --maximum-player-session-count 2 --fleet-id fleet-1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d
在 Local 命令提示符窗口中,日志消息指示 Amazon GameLift Servers Local 已向您的游戏服务器发送
onStartGameSession
回调。如果成功创建了游戏会话,您的游戏服务器通过调用ActivateGameSession
来响应。13:57:36,129 INFO || - [SDKInvokerImpl] Thread-2 - Finished sending event to game server to start a game session: arn:aws:gamelift:local::gamesession/fleet-1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d/gsess-ab423a4b-b827-4765-aea2-54b3fa0818b6. Waiting for ack response.13:57:36,143 INFO || - [SDKInvokerImpl] Thread-2 - Received ack response: true13:57:36,144 INFO || - [CreateGameSessionDispatcher] Thread-2 - GameSession with id: arn:aws:gamelift:local::gamesession/fleet-1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d/gsess-ab423a4b-b827-4765-aea2-54b3fa0818b6 created13:57:36,227 INFO || - [SDKListenerImpl] nioEventLoopGroup-3-1 - onGameSessionActivate received from: /127.0.0.1:60020 and ackRequest requested? true13:57:36,230 INFO || - [SDKListenerImpl] nioEventLoopGroup-3-1 - onGameSessionActivate data: gameSessionId: "arn:aws:gamelift:local::gamesession/fleet-1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d/gsess-abcdef12-3456-7890-abcd-ef1234567890"
在 AWS CLI 窗口中,使用包含游戏会话 ID 的游戏会话对象进行Amazon GameLift Servers响应。请注意,新游戏会话的状态为“Activating”。游戏服务器调 ActivateGameSession用后,状态将变为 “激活”。如果您想查看更改后的状态,请使用 to AWS CLI call
DescribeGameSessions()
。{ "GameSession": { "Status": "ACTIVATING", "MaximumPlayerSessionCount": 2, "FleetId": "fleet-1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d", "GameSessionId": "arn:aws:gamelift:local::gamesession/fleet-1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d/gsess-abcdef12-3456-7890-abcd-ef1234567890", "IpAddress": "127.0.0.1", "Port": 1935 } }
测试游戏服务器和客户端
要检查您的完整游戏集成,包括将玩家连接到游戏,您可以在本地运行游戏服务器和客户端。这使您可以测试从游戏客户端对 Amazon GameLift Servers Local 进行的编程调用。您可以验证以下操作:
-
游戏客户端成功向Amazon GameLift Servers本地服务发 AWS 出 SDK 请求,包括创建游戏会话、检索有关现有游戏会话的信息以及创建玩家会话。
-
游戏服务器在玩家尝试加入游戏会话时,正确验证玩家。对于通过验证的玩家,游戏服务器可能会检索玩家数据 (如果已实施)。
-
游戏服务器在玩家离开游戏时报告断开连接。
-
游戏服务器报告结束游戏会话。
-
启动 Amazon GameLift Servers Local。
打开命令提示符窗口,导航到包含
文件的目录并运行它。默认情况下,Local 在端口 8080 上侦听来自游戏客户端的请求。要指定不同的端口号,请使用GameLiftLocal.jar
-p
参数,如以下示例所示。./gamelift-local -p 9080
Local 启动之后,您可以查看日志,其中显示两个本地服务器已启动,一个列出您的游戏服务器,另一个列出您的游戏客户端或 AWS CLI。
-
启动游戏服务器。
在本地启动您的 Amazon GameLift Servers 集成游戏服务器。有关消息日志的详细信息,请参阅测试游戏服务器。
-
为 Local 配置您的游戏客户端并启用它。
要将您的游戏客户端与 Amazon GameLift Servers Local 服务一起使用,您必须对游戏客户端的设置进行以下更改,如在后端服务Amazon GameLift Servers上进行设置 中所述:
-
更改
ClientConfiguration
对象以指向您的 Local 终端节点,例如http://localhost:9080
。 -
设置目标实例集 ID 值。对于 Local,您不需要实际实例集 ID;可以将目标实例集设置为任意有效字符串(
^fleet-\S+
),例如fleet-1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d
。 -
设置 AWS 凭据。对于 Local,您无需实际的 AWS 凭证,您可以将访问密钥和私有密钥设置为任意字符串。
在 Local 命令提示符窗口中,在您启动游戏客户端之后,日志消息应指示它已初始化
GameLiftClient
,并且已成功与 Amazon GameLift Servers 服务通信。 -
-
测试游戏客户端对 Amazon GameLift Servers 服务的调用。
验证您的游戏客户端已成功进行任意或所有以下 API 调用:
在 Local 命令提示符窗口中,只有对
CreateGameSession()
的调用才会产生日志消息。日志消息显示 Amazon GameLift Servers Local 何时提示您的游戏服务器启动游戏会话(onStartGameSession
回调)并在您的游戏服务器调用它时获取成功的ActivateGameSession
。在 AWS CLI 窗口中,记录导致响应或错误消息的所有 API 调用。 -
确保您的游戏服务器正在验证新玩家连接。
创建游戏会话和玩家会话之后,建立与游戏会话的直接连接。
在 Local 命令提示符窗口中,日志消息应显示游戏服务器已发送
AcceptPlayerSession()
请求来验证新玩家连接。如果您使用 to call AWS CLIDescribePlayerSessions()
,则玩家会话状态应从 “已保留” 更改为 “激活”。 -
验证您的游戏服务器正在将游戏和玩家状态报告给 Amazon GameLift Servers 服务。
要让 Amazon GameLift Servers 管理玩家需求并正确报告指标,您的游戏服务器必须将各种状态报告回 Amazon GameLift Servers。验证 Local 正在记录与以下操作相关的事件。您可能还想使用 AWS CLI 来跟踪状态变化。
-
玩家断开与游戏会话的连接-Amazon GameLift Servers 本地日志消息应显示您的游戏服务器已调用
RemovePlayerSession()
。对DescribePlayerSessions()
的 AWS CLI 调用应体现出状态从Active
更改为Completed
。您还可以调用DescribeGameSessions()
来检查游戏会话的当前玩家数减少了一个。 -
游戏会话结束-Amazon GameLift Servers 本地日志消息应显示您的游戏服务器已调用
TerminateGameSession()
。注意
之前的指导是在结束游戏会话时调用
TerminateGameSession()
。Amazon GameLift Servers服务器 SDK v4.0.1 不建议使用此方法。请参阅结束游戏会话。 -
服务器进程已终止 — Amazon GameLift Servers 本地日志消息应显示您的游戏服务器已调用
ProcessEnding()
。对的 AWS CLI 呼叫DescribeGameSessions()
应反映状态从变Active
为Terminated
(或Terminating
)。
-
Local 的变化
使用 Amazon GameLift Servers Local 时,请记住以下内容:
-
与 Amazon GameLift Servers Web 服务不同,Local 不跟踪服务器的运行状况和启动
onProcessTerminate
回调。Local 仅停止记录游戏服务器的运行状况报告。 -
对于对 AWS SDK 的调用,队列未经验证,可以 IDs 是任何符合参数要求的字符串值 (
^fleet-\S+
)。 -
使用 Local IDs 创建的游戏会话具有不同的结构。它们包括字符串
local
,如此处所示:arn:aws:gamelift:local::gamesession/fleet-123/gsess-56961f8e-db9c-4173-97e7-270b82f0daa6