将玩家网关集成到游戏中 - Amazon GameLift Servers
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

将玩家网关集成到游戏中

创建支持玩家网关的舰队后,必须更新游戏客户端和游戏后端才能与玩家网关集成。您的游戏后端会检索中继端点和玩家网关令牌,然后将其提供给游戏客户端。游戏客户端将所有 UDP 流量发送到这些中继端点。

集成遵循以下调用路径:

  1. 您的游戏后端调用 GetPlayerConnectionDetails API 来检索游戏会话中每位玩家的中继端点和玩家网关令牌。

  2. 您的游戏后端将中继端点和玩家网关令牌发送到游戏客户端。

  3. 您的游戏客户端将玩家网关令牌预先添加到所有传出的 UDP 数据包中,并将数据包发送到中继端点。

  4. 中继网络验证玩家网关令牌并将流量路由到您的游戏服务器。

  5. 您的游戏服务器通过相同的中继路径将流量发送回游戏客户端。

后端集成

您的游戏后端必须调用 GetPlayerConnectionDetails API 来检索玩家的中继端点和玩家网关令牌。然后,后端将这些信息提供给游戏客户端。

GetPlayerConnectionDetails API

GetPlayerConnectionDetailsAPI 会返回游戏会话中玩家的连接详情:

中继端点和令牌

当该位置启用并支持玩家网关时,将返回:

  • 中继端点 — 多个中继端点(IP 地址和端口)因玩家而异

  • 玩家网关令牌 — 客户端必须在所有 UDP 数据包之前添加的令牌(有效期至少 3 分钟)

  • 过期-玩家网关令牌到期时间戳

直接连接

如果该位置未启用或不支持玩家网关,则返回游戏服务器的 IP 地址和端口

您的游戏客户端应设计为可以处理这两种连接类型。

API 调用示例:

// C++ example using AWS SDK Aws::GameLift::GameLiftClient client; Aws::GameLift::Model::GetPlayerConnectionDetailsRequest request; request.SetGameSessionId(gameSessionId); request.SetPlayerIds(playerIds); // Vector of player IDs auto outcome = client.GetPlayerConnectionDetails(request); if (outcome.IsSuccess()) { auto result = outcome.GetResult(); auto connectionDetails = result.GetPlayerConnectionDetails(); // Process each player's connection details for (const auto& detail : connectionDetails) { std::string playerId = detail.GetPlayerId(); // Get relay endpoints (IP address and port) auto endpoints = detail.GetEndpoints(); for (const auto& endpoint : endpoints) { std::string ipAddress = endpoint.GetIpAddress(); int port = endpoint.GetPort(); } // Get player gateway token auto token = detail.GetPlayerGatewayToken(); // Get expiration time auto expiration = detail.GetExpiration(); // Send endpoints and token to game client } }

请参阅GetPlayerConnectionDetailsAmazon GameLift ServersAPI 参考》。

刷新中继端点

当中继端点变得不健康时,请GetPlayerConnectionDetails定期致电为玩家提供更新的端点。我们建议每隔 60 秒为游戏会话中的所有玩家调用 API。要优化 API 的使用,请在单个 API 调用 IDs 中批量处理多个玩家。

重要

定期刷新调用是向玩家提供更新的端点的主要机制。虽然玩家网关令牌的有效期至少为 3 分钟,但每 60 秒刷新一次可确保玩家定期收到更新的终端节点。

客户端集成

您的游戏客户端必须在所有传出的 UDP 数据包中预先添加玩家网关令牌,并将数据包发送到提供的中继端点。C++ for C++ 和虚幻引擎的Amazon GameLift Servers客户端 SDK 提供了简化这种集成的实用工具。

客户端要求

要通过玩家网关路由流量,您的游戏客户端必须:

  • 预置玩家网关令牌 — 将玩家网关令牌预置到所有传出的 UDP 数据包中。玩家网关令牌不得加密,必须出现在每个数据包的开头。没有有效玩家网关令牌的数据包将被丢弃。

  • 发送到中继端点-将所有 UDP 数据包发送到提供的中继端点。

  • 保持连接活动 — 确保游戏客户端向游戏服务器发送数据包,或者游戏服务器至少每 30 秒向玩家发送一次数据包。本活动通过中继网络维护连接。

  • 处理端点更新-从您的后端接受更新的中继端点和玩家网关令牌(建议每 60 秒一次),并在不中断连接的情况下过渡到新的端点。

客户端 SDK

C++ for C++ 和虚幻引擎的Amazon GameLift Servers客户端 SDK 提供了简化玩家网关集成的实用工具:

  • 令牌管理 — 将玩家网关令牌预置到所有传出的 UDP 数据包中。

  • 端点选择-使用可配置算法将流量路由到中继端点。

  • 端点刷新-计划定期回调,以从您的后端检索更新的中继端点和玩家网关令牌。

端点选择算法

客户端 SDK 提供了两种内置算法,用于选择要使用的中继端点:

后备算法

使用一个端点直到其运行状况不佳,然后切换到另一个端点。最适合可以短暂中断的菜单、大厅和回合制游戏。在端点故障转移期间,数据包可能会在配置的超时时间内丢失(默认值:2 秒)。

预测性旋转算法

持续轮换所有可用端点,并在故障发生之前对其进行预测。最适合实时游戏玩法,例如第一人称射击游戏和赛车游戏,在这些游戏中,持续的数据包传输至关重要。要求游戏服务器以一致的频率发送消息。

您还可以通过扩展 SDK 的基础算法类来实现自定义算法。

客户端 SDK 资源

有关完整的集成说明和示例代码,请参阅以下资源:

C++

适用于 C++ 的客户端 SDK 可在适用于 C+ + 的Amazon GameLift Servers客户端 SDK 中找到。

Unreal Engine

虚幻引擎的插件可在虚幻引擎的Amazon GameLift Servers客户端 SDK 中找到。访问权限需要在 Epic Games 组织中的成员资格 GitHub。详情请访问虚幻引擎。 GitHub

测试您的集成。

在部署到队列之前,请使用玩家网关测试工具在本地测试您的玩家网关集成。该工具模拟玩家网关 UDP 代理基础架构,可帮助您验证游戏客户端是否正确预置了玩家网关令牌、通过多个端点路由流量以及处理网络退化问题。

有关设置和使用说明,请参阅上的 P layer Gateway 测试应用程序 GitHub。

最佳实践

集成玩家网关时,请遵循以下最佳实践:

  • 每 60 秒刷新一次端点GetPlayerConnectionDetails 每 60 秒调用一次,以确保玩家定期收到更新的端点。

  • Batch API 调用 — 在同一个游戏会话中GetPlayerConnectionDetails为多个玩家调用时,批量调用以减少 API 开销。

  • 保持连接活动-确保流量至少每 30 秒在游戏客户端和游戏服务器之间流动一次。这可以是 client-to-server或 server-to-client流量。

  • 优雅地处理端点更新 — 当您的游戏客户端从后端收到更新的端点时,在不中断玩家连接的情况下过渡到新的端点。

  • 选择正确的算法 — 选择最符合游戏要求的端点选择算法。回合制游戏使用后备算法,实时游戏使用预测轮换算法。