使用服务质量 (QoS) 信标测量玩家到 Azure 的延迟

您可以将 PlayFab 多人游戏服务器部署到十几个 Azure 区域。 这样做有以下两个原因:

  1. 更多的区域可以提供冗余。 如果单个 Azure 区域发生故障,玩家可以访问其他区域中的服务器。
  2. 更多的区域允许玩家访问离其较近和提供低延迟连接的服务器。

当您调用 RequestMultiplayerServer 时,可以指定 PlayFab 用于满足请求的 Azure 区域的排序列表。 PlayFab 将尝试使用排名第1的区域来满足请求,但如果此区域没有处于备用状态的服务器,或者此区域存在其他故障,则从上到下尝试列表中的次优区域。

您应尽可能使用玩家延迟数据来通知请求多人游戏服务器时使用的 Azure 区域排名。 PlayFab 提供服务和工具来帮助完成此任务。

服务质量信标

PlayFab 在 PlayFab 多人游戏服务器使用的每个 Azure 区域中运行信标。 这些信标将反映 UDP 流量,并可用于测量 UDP 传输延迟。

使用 UDP 非常重要,因为大多数多人游戏都使用 UDP 传输其性能最为关键的游戏流量。 对于 UDP、TCP 和 ICMP 流量,Internet 服务提供商和 Internet 生态系统的其他元素可能会提供差异化的性能。

以下是在玩家设备的上下文中使用这些信标的典型流程:

  1. 让玩家登录 PlayFab。 这通常使用 LoginWithCustomID 或其他登录 API 完成。
  2. 调用 ListQoSServersForTitle。 这将向 PlayFab 的 QoS 信标提供主机名。 典型的实现可能会在游戏的 Multiplayer Menu 页面上执行此过程。
  3. 创建 UDP 套接字。
  4. 向 QoS 服务器端口 3075 发送一个 UDP 数据报。 消息内容必须以 0xFFFF (1111 1111 1111 1111) 开头。
  5. 服务器将回复一个数据报,并将消息内容的前 2 个字节“翻转”为 0x0000 (0000 0000 0000 0000)。 数据报的其余内容复制自初始 ping。
  6. 测量发送 UDP 消息和接收响应之间的时间。

使用服务质量 SDK

PlayFab C# SDK跨平台 (CPP) SDK提供 QoS ping 代码的实现。 您可以构建 SDK 并在电脑游戏中将其用作帮助程序库、引用 C# NuGet 程序包,或者将代码用作其他平台的示例。

每个 API 返回一个 QosResult ,其中包含区域的排序列表以及每个区域的平均 ping 时间。

C#

C# SDK中提供了 QoS API。 gsdkSamples 存储库中提供了示例实现WindowsRunnerCSharpClient

该代码位于 PlayFabQosApi.cs 中。

参数:

  • timeoutMs - 应用于每次 ping 尝试的超时(以毫秒为单位)(默认值: 250 毫秒)。
  • pingsPerRegion - 对每个区域执行 ping 尝试的次数(默认值: 10)。 增加此数值会增加执行时间,但会减少结果不准确的可能性。
  • degreeOfParallelism - 要并行执行的最大 ping 数(默认值: 4)。 增加此数值将减少执行时间,但如果此数值过大,网络争用可能会导致不准确的结果。
        public async Task<QosResult> GetQosResultAsync(
            int timeoutMs = DefaultTimeoutMs,
            int pingsPerRegion = DefaultPingsPerRegion,
            int degreeOfParallelism = DefaultDegreeOfParallelism)
        {

C++

PlayFab 跨平台 (CPP) SDK 中提供两个 QoS API。

该代码位于 PlayFabQosApi.cpp 中。

参数:

  • numThreads - 要并行执行的最大 ping 数。 增加此数值将减少执行时间,但如果此数值过大,网络争用可能会导致不准确的结果。
  • timeoutMs - 应用于每次 ping 尝试的超时(以毫秒为单位)(默认值: 250 毫秒)。
  // Runs a QoS operation asynchronously. The operation pings a set of datacenters and returns a result with average response times.
  std::future<QoSResult> GetQoSResultAsync(unsigned int numThreads, unsigned int timeoutMs = DEFAULT_TIMEOUT_MS);

  // Runs a QoS operation synchronously. The operation pings a set of datacenters and returns a result with average response times.
  QoSResult GetQoSResult(unsigned int numThreads, unsigned int timeoutMs = DEFAULT_TIMEOUT_MS);