サービスの品質 (QoS) ビーコンを使用して Azure に対するプレイヤー レイテンシを測定する
PlayFab マルチプレイヤー サーバーを十数か所の Azure リージョンに配置できます。 これを行うには以下の 2 つの理由があります。
- リージョンが追加され、冗長性が提供されます。 1 つの Azure リージョンで障害が発生した場合、プレイヤーは他のリージョンのサーバーにアクセスできます。
- リージョンの追加によってプレイヤーは「近くにある」サーバーにアクセスできるため、低遅延の接続が実現されます。
RequestMultiplayerServer を呼び出すときに、PlayFab が要求を処理するために使用する Azure リージョンのランク付きリストを指定します。 PlayFab はランクが 1 番のリージョンを使用して要求を処理しようとしますが、そのリージョンにスタンバイ サーバーがない場合やそのリージョンで障害が発生している場合に、リストで次に最適なリージョンを試行します。
可能であればいつでもプレイヤーの遅延データを使用して、マルチプレイヤー サーバーの要求時に使用される Azure リージョンのランキングを通知します。 PlayFab では、このタスクを支援するサービスとツールが提供されています。
サービスの品質ビーコン
PlayFab は PlayFab マルチプレイヤー サーバーで使用されているすべての Azure リージョンでビーコンを運用しています。 これらのビーコンは UDP トラフィックを反映しており、UDP トランスポートによる遅延を測定するために使用できます。
ほとんどのマルチプレイヤー ゲームでは最もパフォーマンスが重要なゲーム トラフィックで UDP トランスポートが使用されているため、UDP を使用することは重要です。 インターネット サービス プロバイダーやインターネット エコシステムの他の要素では、UDP と TCP と ICMP のフローに対して差別化されたパフォーマンスが提供されていることがあります。
プレイヤーのデバイスのコンテキストでこれらビーコンを使用するための一般的なフローを以下に示します。
- プレイヤーが PlayFab にログインします。 これは通常、LoginWithCustomID または別のログイン API を使用して行われます。
- ListQoSServersForTitle を呼び出します。 これにより、PlayFab の QoS ビーコンにホスト名が提供されます。 一般的な実装では、この手順はゲームの [マルチプレイヤー メニュー] ページで行われることがあります。
- UDP ソケットを作成します。
- 単一の UDP データグラムを QoS サーバーのポート 3075 に送信します。 そのメッセージの内容は 0xFFFF (1111 1111 1111 1111) で始まっている必要があります。
- サーバーは単一のデータグラムで応答し、そのメッセージの内容の最初の 2 バイトは 0x0000 (0000 0000 0000 0000) に「反転」されています。 データグラムの内容の残りの部分は、初回の ping からコピーされます。
- UDP メッセージを送信してから応答を受信するまでの時間を測定します。
サービス品質 SDK を使用する
PlayFab SDK C# とクロスプラットフォーム (CPP) SDK は、QoS ping コードの実装を提供します。 SDK をビルドして PC ゲームでヘルパー ライブラリーとして使用することも、そのC# NuGet パッケージを参照したり、他のプラットフォーム用の例としてコードを使用することもできます。
各 API は、リージョンの並べ替えられた一覧と各リージョンへの平均 ping 時間を含む QosResult
を返します。
C#
C# SDK で使用できる QoS API があります。 WindowsRunnerCSharpClient サンプル実装は、gsdkSamples リポジトリで使用できます。
このコードは、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 で使用できる 2 つの 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);