> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# QoS ビーコンを使用して Azure へのプレイヤー遅延を測定する

> PlayFab の QoS ビーコンを使用して、Azure リージョンへのプレイヤーの遅延を測定し、RequestMultiplayerServer 呼び出し時にランク付けすることで、より低遅延のマッチメイキングを実現します。

# Quality-of-Service (QoS) ビーコンを使用して Azure へのプレイヤー遅延を測定する

PlayFab のマルチプレイヤー サーバーは、10 個以上の Azure リージョンにデプロイできます。これには 2 つの理由があります。

1. 追加のリージョンは冗長性を提供します。単一の Azure リージョンで障害が発生しても、プレイヤーは他のリージョンのサーバーにアクセスできます。
2. 追加のリージョンにより、プレイヤーは「近く」のサーバーにアクセスでき、低遅延の接続が可能になります。

[RequestMultiplayerServer](xref:titleid.playfabapi.com.multiplayer.multiplayerserver.requestmultiplayerserver) を呼び出す際は、PlayFab がリクエストの処理に使用する Azure リージョンのランク付きリストを指定します。PlayFab はランク 1 位のリージョンでリクエストを処理しようとしますが、そのリージョンで待機しているサーバーがない場合や、そのリージョンに何らかの障害がある場合は、リストのより下位の準最適なリージョンが試行されます。

可能な限り、マルチプレイヤー サーバーを要求する際に使用する Azure リージョンのランク付けには、プレイヤーの遅延データを活用してください。PlayFab は、このタスクを支援するサービスとツールを提供しています。

## Quality-of-service ビーコン

PlayFab は、PlayFab マルチプレイヤー サーバーが使用しているすべての Azure リージョンでビーコンを運用しています。これらのビーコンは UDP トラフィックを反射し、UDP トランスポートによる遅延測定に使用できます。

UDP の使用は重要です。なぜなら、ほとんどのマルチプレイヤー ゲームは、パフォーマンスが最も重要なゲーム トラフィックに UDP トランスポートを使用するためです。インターネット サービス プロバイダーやその他のインターネット エコシステムの要素は、UDP、TCP、ICMP フローごとに異なるパフォーマンスを提供する場合があります。

プレイヤー デバイスのコンテキストでこれらのビーコンを使用する場合の一般的な流れは以下のとおりです。

1. プレイヤーを PlayFab にログインさせます。通常は [LoginWithCustomID](xref:titleid.playfabapi.com.client.authentication.loginwithcustomid) やその他のログイン API を使用します。
2. [ListQoSServersForTitle](xref:titleid.playfabapi.com.multiplayer.multiplayerserver.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 メッセージを送信してから応答を受信するまでの時間を測定します。

## Quality-of-service SDK の使用

PlayFab の [C# SDK](https://github.com/PlayFab/CSharpSDK) と [クロスプラットフォーム (CPP) SDK](https://github.com/PlayFab/XPlatCppSdk) は、QoS ping コードの実装を提供します。SDK をビルドして PC ゲームのヘルパー ライブラリとして使用したり、C# NuGet パッケージを参照したり、他のプラットフォームのサンプルとしてコードを使用したりできます。

各 API は `QosResult` を返します。これには、各リージョンへの平均 ping 時間とともにリージョンのソート済みリストが含まれます。

### C\#

[C# SDK](https://github.com/PlayFab/CSharpSDK) では QoS API が利用できます。サンプル実装 [WindowsRunnerCSharpClient](https://github.com/PlayFab/gsdkSamples/tree/master/WindowsRunnerCSharp#running-the-client) は [gsdkSamples リポジトリ](https://github.com/PlayFab/gsdkSamples) にあります。

コードは [*PlayFabQosApi.cs*](https://github.com/PlayFab/CSharpSDK/blob/master/PlayFabSDK/source/Qos/PlayFabQosApi.cs) にあります。

パラメーター:

* `timeoutMs` - 各 ping 試行に適用されるタイムアウト (ミリ秒単位) (デフォルト: 250 ミリ秒)。
* `pingsPerRegion` - 各リージョンに対して行う ping 試行の回数 (デフォルト: 10)。この数を増やすと実行時間が長くなりますが、不正確な結果になる可能性が減少します。
* `degreeOfParallelism` - 並列で行う ping の最大数 (デフォルト: 4)。この数を増やすと実行時間は短縮されますが、この数が大きすぎるとネットワークの競合により不正確な結果になる場合があります。

```csharp theme={null}
        public async Task<QosResult> GetQosResultAsync(
            int timeoutMs = DefaultTimeoutMs,
            int pingsPerRegion = DefaultPingsPerRegion,
            int degreeOfParallelism = DefaultDegreeOfParallelism)
        {
```

### C++

[PlayFab クロスプラットフォーム (CPP) SDK](https://github.com/PlayFab/XPlatCppSdk) では 2 つの QoS API が利用できます。

コードは [*PlayFabQosApi.cpp*](https://github.com/PlayFab/XPlatCppSdk/blob/master/code/source/playfab/QoS/PlayFabQoSApi.cpp) にあります。

パラメーター:

* `numThreads` - 並列で行う ping の最大数。この数を増やすと実行時間は短縮されますが、この数が大きすぎるとネットワークの競合により不正確な結果になる場合があります。
* `timeoutMs` - 各 ping 試行に適用されるタイムアウト (ミリ秒単位) (デフォルト: 250 ミリ秒)。

```cpp theme={null}
  // 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);
```


## Related topics

- [GDK での Quality of Service の測定](/ja-jp/build/console-features/networking/game-mesh/qos-networking.md)
- [PlayFab Multiplayer Servers を使ってマルチプレイヤーゲームをホストする](/ja-jp/services/playfab/multiplayer/servers/using-playfab-servers-to-host-games.md)
- [PlayFab Party QoS measurements](/ja-jp/services/playfab/multiplayer/networking/concepts-regions.md)
- [マルチプレイヤーセッションテンプレート](/ja-jp/services/xbox-services/multiplayer/mpsd/concepts/live-session-templates.md)
- [ターゲット セッションの初期化と QoS](/ja-jp/services/xbox-services/multiplayer/matchmaking/concepts/live-matchmaking-target-session.md)
