Amazon GameLift
开发人员指南 (版本 )
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

测试集成

使用 Amazon GameLift Local 可以在本地设备上运行 Amazon GameLift 服务的有限版本,并在其上测试您的游戏集成。此工具在对您的游戏集成进行迭代开发时非常有用。其替代方法是将每个新生成的游戏上传到 Amazon GameLift 并配置队组来托管游戏,此过程每次都需要 30 分钟或更长时间。

通过 Amazon GameLift Local,您可以验证以下内容:

  • 您的游戏服务器与服务器开发工具包正确集成,并且正确与 Amazon GameLift 服务通信,可启动新游戏会话、接受新玩家和报告运行状况及状态。

  • 您的游戏客户端与适用于 Amazon GameLift 的 AWS 开发工具包正确集成,可以检索现有游戏会话的信息,启动新游戏会话,让玩家加入游戏并连接到游戏会话。

Amazon GameLift Local 是一个命令行工具,可启动 Amazon GameLift 服务的独立版本。Amazon GameLift Local 还提供了服务器进程初始化、运行状况检查以及 API 调用和响应的运行事件日志。Amazon GameLift Local 可识别适用于 Amazon GameLift 的 AWS 开发工具包操作的子集。您可以从 AWS CLI 或者从游戏客户端进行调用。在本地执行的所有 API 操作与在 Amazon GameLift Web 服务上执行时完全一样。

设置 Amazon GameLift Local

Amazon GameLift Local 作为与服务器开发工具包捆绑的可执行 .jar 文件提供。它可以在 Windows 或 Linux 上运行,并可用于任何 Amazon GameLift 支持的语言。

在运行 Local 之前,您还必须已安装以下各项。

  • Amazon GameLift 服务器开发工具包版本 3.1.5 或更高版本

  • Java 8

测试游戏服务器

如果您只要测试游戏服务器,则可以使用 AWS CLI 来模拟游戏客户端对 Amazon GameLift Local 服务的调用。这将验证您的游戏服务器是否按预期执行以下操作:

  • 游戏服务器正确启动并初始化 Amazon GameLift 服务器开发工具包。

  • 在启动过程中,游戏服务器通知 Amazon GameLift,服务器已准备好托管游戏会话。

  • 在运行时,游戏服务器每分钟将运行状况发送到 Amazon GameLift。

  • 游戏服务器响应请求,启动新游戏会话。

  1. 启动 Amazon GameLift Local。

    打开命令提示符窗口,导航到包含 GameLiftLocal.jar 文件的目录并运行它。默认情况下,Local 在端口 8080 上侦听来自游戏客户端的请求。要指定不同的端口号,请使用 -p 参数,如以下示例所示:

    java -jar GameLiftLocal.jar -p 9080

    Local 启动之后,您可以查看日志,其中指示两个本地服务器已启动,一个列出您的游戏服务器,另一个列出您的游戏客户端或 AWS CLI。日志继续报告两个本地服务器上的活动,包括往返于游戏组件之间的通信。

  2. 启动游戏服务器。

    在本地启动您的 Amazon GameLift 集成游戏服务器。您无需更改游戏服务器的终端节点。

    在 Local 命令提示符窗口中,日志消息指示您的游戏服务器已连接至 Amazon GameLift Local 服务。这意味着游戏服务器已成功初始化 Amazon GameLift 服务器开发工具包(使用 InitSDK())。它使用所示的日志路径调用 ProcessReady(),如果成功,则已准备好托管游戏会话。在游戏服务器运行期间,Amazon GameLift 记录来自各游戏服务器的各个运行状况报告。以下日志消息示例显示了成功集成的游戏服务器:

    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 did not find a process with pID: <process ID>! 是否已调用 InitSDK()?”

    • 警告:“Process state already exists for process with pID: <process ID>! 是否已多次调用 ProcessReady(...)?”

  3. 启动 AWS CLI。

    在您的游戏服务器成功调用 ProcessReady() 之后,您可以开始进行客户端调用。打开另一个命令提示符窗口并启动 AWS CLI 工具。如果您尚未进行设置,请参阅安装 AWS CLI。默认情况下,AWS CLI 使用 Amazon GameLift Web 服务终端节点。您必须在使用 --endpoint-url 参数的每个请求中,使用 Local 终端节点覆盖此项,如以下示例请求中所示。

    aws gamelift describe-game-sessions --endpoint-url http://localhost:9080 --fleet-id fleet-123

    在 AWS CLI 命令提示符窗口中,调用 AWS 开发工具包 API 会生成如上文所示的响应。

  4. 创建游戏会话.

    使用 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 Local 已向您的游戏服务器发送 onStartGameSession 回调。如果成功创建了游戏会话,您的游戏服务器通过调用 ActivateGameSession 来响应。

    13:57:36,129 INFO || - [SDKInvokerImpl] Thread-2 - Finished sending event to game server to start a game session: arn:aws-cn: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-cn: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-cn:gamelift:local::gamesession/fleet-1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d/gsess-abcdef12-3456-7890-abcd-ef1234567890"

    在 AWS CLI 窗口中,Amazon GameLift 使用包含游戏会话 ID 的游戏会话对象进行响应。请注意,新游戏会话的状态为“Activating”。游戏会话调用 ActivateGameSession 后,状态将更改为“Active”。如果您希望查看更改后的状态,请使用 AWS CLI 调用 DescribeGameSessions()

    { "GameSession": { "Status": "ACTIVATING", "MaximumPlayerSessionCount": 2, "FleetId": "fleet-1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d", "GameSessionId": "arn:aws-cn:gamelift:local::gamesession/fleet-1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d/gsess-abcdef12-3456-7890-abcd-ef1234567890", "IpAddress": "127.0.0.1", "Port": 1935 } }

测试游戏服务器和客户端

要检查您的完整游戏集成,包括将玩家连接到游戏,您可以在本地运行游戏服务器和客户端。这使您可以测试从游戏客户端对 Amazon GameLift Local 进行的编程调用。您可以验证以下操作:

  • 游戏客户端成功向 Amazon GameLift Local 服务发出 AWS 开发工具包请求,包括创建游戏会话、检索现有游戏会话上的信息以及创建玩家会话。

  • 游戏服务器在玩家尝试加入游戏会话时,正确验证玩家。对于通过验证的玩家,游戏服务器可能会检索玩家数据 (如果已实施)。

  • 游戏服务器在玩家离开游戏时报告断开连接。

  • 游戏服务器报告结束游戏会话。

  1. 启动 Amazon GameLift Local。

    打开命令提示符窗口,导航到包含 GameLiftLocal.jar 文件的目录并运行它。默认情况下,Local 在端口 8080 上侦听来自游戏客户端的请求。要指定不同的端口号,请使用 -p 参数,如以下示例所示。

    ./gamelift-local -p 9080

    Local 启动之后,您可以查看日志,其中显示两个本地服务器已启动,一个列出您的游戏服务器,另一个列出您的游戏客户端或 AWS CLI。

  2. 启动游戏服务器。

    在本地启动您的 Amazon GameLift 集成游戏服务器。有关消息日志的详细信息,请参阅测试游戏服务器

  3. 为 Local 配置您的游戏客户端并启用它。

    要将您的游戏客户端与 Amazon GameLift Local 服务一起使用,您必须对游戏客户端的设置进行以下更改,如在客户端或服务中设置 Amazon GameLift 中所述:

    • 更改 ClientConfiguration 对象以指向您的 Local 终端节点,例如 http://localhost:9080

    • 设置目标队组 ID 值。对于 Local,您不需要实际队组 ID;可以将目标队组设置为任意有效字符串 (^fleet-\S+),例如 fleet-1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d

    • 设置 AWS 凭证。对于 Local,您无需实际的 AWS 凭证,您可以将访问密钥和私有密钥设置为任意字符串。

    在 Local 命令提示符窗口中,在您启动游戏客户端之后,日志消息应指示它已初始化 GameLiftClient,并且已成功与 Amazon GameLift 服务通信。

  4. 测试游戏客户端对 Amazon GameLift 服务的调用。

    验证您的游戏客户端已成功进行任意或所有以下 API 调用:

    在 Local 命令提示符窗口中,只有对 CreateGameSession() 的调用才会产生日志消息。日志消息显示 Amazon GameLift Local 何时提示您的游戏服务器启动游戏会话(onStartGameSession 回调)并在您的游戏服务器调用它时获取成功的 ActivateGameSession。在 AWS CLI 窗口中,记录导致响应或错误消息的所有 API 调用。

  5. 确保您的游戏服务器正在验证新玩家连接。

    创建游戏会话和玩家会话之后,建立与游戏会话的直接连接。

    在 Local 命令提示符窗口中,日志消息应显示游戏服务器已发送 AcceptPlayerSession() 请求来验证新玩家连接。如果您使用 AWS CLI 调用 DescribePlayerSessions(),玩家会话状态应从“Reserved”更改为“Active”。

  6. 验证您的游戏服务器正在将游戏和玩家状态报告给 Amazon GameLift 服务。

    要让 Amazon GameLift 管理玩家需求并正确报告指标,您的游戏服务器必须将各种状态报告回 Amazon GameLift。验证 Local 正在记录与以下操作相关的事件。您可能还希望使用 AWS CLI 跟踪状态更改。

    • 玩家从游戏会话断开连接 – Amazon GameLift Local 日志消息应显示游戏服务器调用了 RemovePlayerSession()。对 DescribePlayerSessions() 的 AWS CLI 调用应体现出状态从 Active 更改为 Completed。您还可以调用 DescribeGameSessions() 来检查游戏会话的当前玩家数减少了一个。

    • 游戏会话结束 – Amazon GameLift Local 日志消息应显示游戏服务器调用了 TerminateGameSession()。对 DescribeGameSessions() 的 AWS CLI 调用应体现出状态从 Active 更改为 Terminated(或 Terminating)。

    • 服务器进程终止 – Amazon GameLift Local 日志消息应显示游戏服务器调用了 ProcessEnding()

Local 的变化

使用 Amazon GameLift Local 时,请记住以下内容:

  • 与 Amazon GameLift Web 服务不同,Local 不跟踪服务器的运行状况和启动 onProcessTerminate 回调。Local 仅停止记录游戏服务器的运行状况报告。

  • 对于面向 AWS 开发工具包的调用,不验证队组 ID,该 ID 可以是满足参数要求 (^fleet-\S+) 的任意字符串值。

  • 使用 Local 创建的游戏会话 ID 具有不同结构。它们包括字符串 local,如此处所示:

    arn:aws-cn:gamelift:local::gamesession/fleet-123/gsess-56961f8e-db9c-4173-97e7-270b82f0daa6