Verwenden von QoS-Beacons (Quality-of-Service) zum Messen der Spielerlatenz in Azure

Sie können PlayFab-Multiplayerserver in mehr als einem Dutzend Azure-Regionen bereitstellen. Hierfür gibt es zwei Gründe:

  1. Zusätzliche Regionen bieten Redundanz. Wenn eine einzelne Azure-Region ausfällt, können Spieler auf Server in anderen Regionen zugreifen.
  2. Zusätzliche Regionen ermöglichen es Spielern, auf Server zuzugreifen, die sich "in der Nähe" befinden und Verbindungen mit geringer Latenz bereitstellen.

Wenn Sie RequestMultiplayerServer aufrufen, geben Sie eine Rangfolgeliste der Azure-Regionen an, die PlayFab zum Erfüllen der Anforderung verwendet. PlayFab versucht, die Anforderung mit der Rangfolge #1 zu erfüllen, aber wenn in dieser Region keine Server vorhanden sind oder die Region einen anderen Fehler aufweist, wird eine suboptimale Region weiter unten in der Liste versucht.

Wenn möglich, sollten Sie Daten zur Spielerlatenz verwenden, um die Rangfolge der Azure-Regionen zu ermitteln, die beim Anfordern eines Multiplayerservers verwendet wurden. PlayFab bietet Dienste und Tools zur Unterstützung dieser Aufgabe.

Quality-of-Service-Beacons

PlayFab betreibt Beacons in jeder Azure-Region, die von PlayFab-Multiplayerservern verwendet werden. Diese Beacons spiegeln UDP-Datenverkehr wider und können verwendet werden, um die Latenz mit UDP-Transport zu messen.

Die Verwendung von UDP ist wichtig, da die meisten Multiplayer-Spiele UDP-Transport für ihren leistungskritischen Spieldatenverkehr verwenden. Internetdienstanbieter und andere Elemente des Internetökosystems können eine differenzierte Leistung für UDP- und TCP- und ICMP-Flows bereitstellen.

Dies ist der typische Ablauf für die Verwendung dieser Beacons im Kontext eines Spielergeräts:

  1. Melden Sie den Spieler bei PlayFab an. Dies erfolgt in der Regel mit einer LoginWithCustomID oder einer anderen Anmelde-API.
  2. Rufen Sie ListQoSServersForTitle auf. Dadurch werden Hostnamen für die QoS-Beacons von PlayFab bereitgestellt. Eine typische Implementierung kann dazu führen, dass dieses Verfahren auf der Multiplayermenüseite für das Spiel erfolgt.
  3. Erstellen Sie einen UDP-Socket.
  4. Senden Sie ein einzelnes UDP-Datagramm an Port 3075 auf dem QoS-Server. Der Nachrichteninhalt muss mit 0xFFFF (1111 1111 1111 1111) beginnen.
  5. Der Server antwortet mit einem einzelnen Datagramm, wobei der Nachrichteninhalt die ersten 2 Bytes auf 0x0000 "gekippt" hat (0000 0000 0000 0000). Der rest des Datagramminhalts wird aus dem anfänglichen Ping kopiert.
  6. Messen Sie die Zeit zwischen dem Senden der UDP-Nachricht und dem Empfangen einer Antwort.

Verwenden des Quality-of-Service-SDK

Das PlayFab C#-SDK und das plattformübergreifende SDK (CPP) stellen eine Implementierung des QoS-Pingcodes bereit. Sie können ein SDK erstellen und als Hilfsbibliothek in Ihren PC-Spielen verwenden, auf das C#-NuGet-Paket verweisen oder den Code als Beispiel für andere Plattformen verwenden.

Jede API gibt eine QosResult zurück, die eine sortierte Liste von Regionen zusammen mit der durchschnittlichen Pingzeit für jede Region enthält.

C#

Im C#-SDK sind QoS-APIs verfügbar. Eine Beispielimplementierung, WindowsRunnerCSharpClient, ist im gsdkSamples-Repository verfügbar.

Der Code befindet sich in PlayFabQosApi.cs.

Parameter:

  • timeoutMs – Das Timeout (in Millisekunden), das auf jeden Pingversuch angewendet wird (Standard: 250 ms).
  • pingsPerRegion – Die Anzahl der Pingversuche, die für jede Region durchgeführt werden sollen (Standard: 10). Wenn Sie diese Anzahl erhöhen, wird die Ausführungszeit erhöht, aber die Wahrscheinlichkeit ungenauer Ergebnisse verringert.
  • degreeOfParallelism – Die maximale Anzahl von Pings, die parallel ausgeführt werden sollen (Standard: 4). Wenn Sie diese Anzahl erhöhen, wird die Ausführungszeit reduziert, aber Netzwerkkonflikte können zu ungenauen Ergebnissen führen, wenn diese Zahl zu groß ist.
        public async Task<QosResult> GetQosResultAsync(
            int timeoutMs = DefaultTimeoutMs,
            int pingsPerRegion = DefaultPingsPerRegion,
            int degreeOfParallelism = DefaultDegreeOfParallelism)
        {

C++

Es gibt die beiden QoS-APIs, die im CPP-SDK (Cross-Platform) von PlayFab verfügbar sind.

Der Code befindet sich in PlayFabQosApi.cpp.

Parameter:

  • numThreads – Die maximale Anzahl von Pings, die parallel ausgeführt werden sollen. Wenn Sie diese Anzahl erhöhen, wird die Ausführungszeit reduziert, aber Netzwerkkonflikte können zu ungenauen Ergebnissen führen, wenn diese Zahl zu groß ist.
  • timeoutMs – Das Timeout (in Millisekunden), das auf jeden Pingversuch angewendet wird (Standard: 250 ms).
  // 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);