使用亚马逊GameLift本地测试您的集成 - 亚马逊 GameLift
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

使用亚马逊GameLift本地测试您的集成

注意

如果您使用的是 4.x 或更早版本的 Amazon GameLift 服务器 SDK 版本,请使用此测试程序。您的服务器 SDK 包包含兼容版本的 Amazon Loca GameLift l。

使用 Amazon Local GameLift 在本地设备上运行亚马逊托管GameLift服务的限定版本,并针对该设备测试您的游戏集成。此工具在对您的游戏集成进行迭代开发时非常有用。另一种方法是将每个新版本上传到亚马逊GameLift并配置队列来托管您的游戏,每次可能需要 30 分钟或更长时间。

使用 Amazon Loca GameLift l,您可以验证以下内容:

  • 您的游戏服务器已与 Server SDK 正确集成,并且正在与亚马逊GameLift服务正常通信,以启动新的游戏会话、接受新玩家并报告健康和状态。

  • 您的游戏客户端已GameLift与亚马逊 Amazon SDK 正确集成,能够检索有关现有游戏会话的信息、启动新的游戏会话、让玩家加入游戏并连接到游戏会话。

Amazon Loca GameLift l 是一种命令行工具,用于启动亚马逊GameLift托管服务的独立版本。Amazon Loca GameLift l 还提供服务器进程初始化、运行状况检查以及 API 调用和响应的运行事件日志。Amazon GameLift Local 可识别亚马逊 Amazon SDK 操作的子集GameLift。您可以从 Amazon CLI 或者从游戏客户端进行调用。所有 API 操作在本地执行,就像在亚马逊GameLift网络服务中一样。

每个服务器进程只能托管一个游戏会话。游戏会话是你用来连接到 Amazon GameLift Local 的可执行文件。游戏会话完成后,你应该调用GameLiftServerSDK::ProcessEndning然后退出进程。使用 Amazon Lo GameLift cal 进行本地测试时,您可以启动多个服务器进程。每个进程都将连接到 Amazon Lo GameLift cal。然后,您可以为每个服务器进程创建一个游戏会话。当您的游戏会话结束时,您的游戏服务器进程应退出。然后必须手动启动另一个服务器进程。

亚马逊GameLift本地支持以下 API:

  • CreateGameSession

  • CreatePlayerSession

  • CreatePlayerSessions

  • DescribeGameSessions

  • DescribePlayerSessions

GameLift在本地设置亚马逊

Amazon GameLift Local 作为与服务器 SDK 捆绑在一起的可执行.jar文件提供。它可以在 Windows 或 Linux 上运行,并与亚马逊GameLift支持的任何语言一起使用。

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

  • 亚马逊GameLift服务器 SDK 版本 3.1.5 到 4.x 的版本。

  • Java 8

测试游戏服务器

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

  • 游戏服务器正常启动并初始化亚马逊GameLift服务器 SDK。

  • 作为启动过程的一部分,游戏服务器通知亚马逊GameLift服务器已准备好托管游戏会话。

  • 游戏服务器在运行时GameLift每分钟向亚马逊发送一次健康状态。

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

  1. 启动亚马逊GameLift本地。

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

    java -jar GameLiftLocal.jar -p 9080

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

  2. 启动游戏服务器。

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

    在本地命令提示符窗口中,日志消息表明您的游戏服务器已连接到 Amazon Loca GameLift l 服务。这意味着您的游戏服务器成功初始化了亚马逊GameLift服务器 SDK(使用InitSDK())。它使用所示的日志路径调用 ProcessReady(),如果成功,则已准备好托管游戏会话。在游戏服务器运行时,亚马逊会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未找到带有 pID 的进程:<process ID>! initSDK () 被调用了吗?”

    • 警告:“带有 pID 的进程的进程状态已经存在:<process ID>! ProcessReady(...) 是否多次被调用?”

  3. 启动 Amazon CLI。

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

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

    在Amazon CLI命令提示符窗口中,Amazon gamelift命令会生成响应,如Amazon CLI命令参考中所述。

  4. 创建游戏会话。

    使用Amazon CLI,提交 CreateGameSession() 请求。该请求应采用预期的语法。对于 Local,FleetId 参数可以设置为任意有效字符串 (^fleet-\S+)。

    Amazon gamelift create-game-session --endpoint-url http://localhost:9080 --maximum-player-session-count 2 --fleet-id fleet-1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d

    在本地命令提示符窗口中,日志消息表明 Amazon Loca GameLift l 已向您的游戏服务器发送了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"

    在Amazon CLI窗口中,亚马逊使用包含游戏会话 ID 的游戏会话对象进行GameLift响应。请注意,新游戏会话的状态为“Activating”。游戏服务器调用ActivateGameSession后,状态将更改为 Active。如果您希望查看更改后的状态,请使用 Amazon CLI 调用 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 Local 的编程调用。您可以验证以下操作:

  • 游戏客户端成功向 Amazon Loca GameLift l 服务发出 Amazon SDK 请求,包括创建游戏会话、检索有关现有游戏会话的信息以及创建玩家会话。

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

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

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

  1. 启动亚马逊GameLift本地。

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

    ./gamelift-local -p 9080

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

  2. 启动游戏服务器。

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

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

    要将您的游戏客户端与 Amazon Loca GameLift l 服务一起使用,您必须对游戏客户端的设置进行以下更改,如中所述在后端服务GameLift上设置亚马逊

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

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

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

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

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

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

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

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

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

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

  6. 确认您的游戏服务器正在向亚马逊GameLift服务报告游戏和玩家状态。

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

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

    • 游戏会话结束 — Amazon Loca GameLift l 日志消息应显示您的游戏服务器正在调用TerminateGameSession()

      注意

      之前的指导方针是在游戏会话结束TerminateGameSession()时打电话。亚马逊GameLift服务器 SDK v4.0.1 已弃用此方法。请参阅结束游戏会话

    • 服务器进程已终止 — Amazon Loca GameLift l 日志消息应显示您的游戏服务器正在调用ProcessEnding()。对 DescribeGameSessions() 的 Amazon CLI 调用应体现出状态从 Active 更改为 Terminated(或 Terminating)。

与本地的差异

使用 Amazon Loca GameLift l 时,请记住以下几点:

  • 与亚马逊GameLift网络服务不同,Local 不跟踪服务器的运行状况并启动onProcessTerminate回调。Local 仅停止记录游戏服务器的运行状况报告。

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

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

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