本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
将玩家网关集成到游戏中
创建支持玩家网关的舰队后,必须更新游戏客户端和游戏后端才能与玩家网关集成。您的游戏后端会检索中继端点和玩家网关令牌,然后将其提供给游戏客户端。游戏客户端将所有 UDP 流量发送到这些中继端点。
集成遵循以下调用路径:
-
您的游戏后端调用
GetPlayerConnectionDetailsAPI 来检索游戏会话中每位玩家的中继端点和玩家网关令牌。 -
您的游戏后端将中继端点和玩家网关令牌发送到游戏客户端。
-
您的游戏客户端将玩家网关令牌预先添加到所有传出的 UDP 数据包中,并将数据包发送到中继端点。
-
中继网络验证玩家网关令牌并将流量路由到您的游戏服务器。
-
您的游戏服务器通过相同的中继路径将流量发送回游戏客户端。
后端集成
您的游戏后端必须调用 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 } }
请参阅GetPlayerConnectionDetails《Amazon 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 测试应用程序
最佳实践
集成玩家网关时,请遵循以下最佳实践:
-
每 60 秒刷新一次端点 —
GetPlayerConnectionDetails每 60 秒调用一次,以确保玩家定期收到更新的端点。 -
Batch API 调用 — 在同一个游戏会话中
GetPlayerConnectionDetails为多个玩家调用时,批量调用以减少 API 开销。 -
保持连接活动-确保流量至少每 30 秒在游戏客户端和游戏服务器之间流动一次。这可以是 client-to-server或 server-to-client流量。
-
优雅地处理端点更新 — 当您的游戏客户端从后端收到更新的端点时,在不中断玩家连接的情况下过渡到新的端点。
-
选择正确的算法 — 选择最符合游戏要求的端点选择算法。回合制游戏使用后备算法,实时游戏使用预测轮换算法。