PlayFab パーティーおよびピア ツー ピアの直接接続

このページでは、サンプル ゲーム コードを使用して PlayFab パーティーで直接ピア ツー ピア接続を有効にして使用する方法について説明します。 また、ゲームで直接ピアツーピア接続を使用するタイミングを評価するのに役立つ考慮事項も含まれています。

ピア ツー ピアの直接接続を使用するタイミング

PlayFab パーティーは柔軟に設計されており、さまざまな通信トポロジに対応します。 概念的には、すべてのチャットまたはデータのメッセージは、1 つのピア デバイスまたはユーザーから他のユーザーに直接送信されます。 ただし、パーティは透過的なクラウド リレー サービスを自動的に利用して直接的なピアツーピア接続を確立する際の一般的な環境とセキュリティの問題を回避します。 バックグラウンドサービス品質 (QoS) 測定を利用することで、低待機時間のデータ転送を実現できます。 (詳細については、「PlayFab パーティーの QoS 測定」を参照してください)。必要に応じて、直接ピア ツー ピア接続を有効にして、データ転送の待機時間をさらに短縮できます。 以下の「セキュリティに関する考慮事項」で詳しく説明されているセキュリティ上の懸念から、タイトルに厳密な待機時間要件がない限り、直接ピアツーピア接続を有効にするのではなく、クラウド リレー サービスを使用することをお勧めします。

プラットフォームのサポート

直接ピア接続は、パーティー ライブラリの Windows 10、Microsoft Game Core、Nintendo Switch、PlayStation®4、PlayStation®5 バージョンでサポートされています。 ライブラリの他のバージョンでは、クライアント API で指定された直接ピア接続オプションに関係なく、常にデータ転送にクラウド リレーが使用されます。

"PlayStation" は、Sony Interactive Entertainment Inc. の登録商標または商標です。

セキュリティに関する考慮事項

直接ピア接続は、クライアント間で直接データを送信するために使用されるため、クライアントは互いに接続する方法を知る必要があります。 これは、ゲーム セッション内のクライアント間でクライアント IP アドレスを共有することによって行われます。 例えば、16人のプレイヤーが参加するマルチプレイヤーゲームで、直接ピア接続を使用してプレイヤーの位置を更新する場合、16 人のゲーム クライアントはそれぞれ、データの送信先を知るために、他の 15 人のクライアントの IP アドレスを認識する必要があります。

ゲーム クライアント間で IP アドレスを共有することは、セキュリティ 上のリスクです。 IP アドレスを共有すると、悪意のある誰かが IP アドレスを検出し、それを使用してゲーム外の他のプレイヤーを悪意を持って攻撃するのに利用できる可能性があります。 これらの攻撃を実行する一般的な方法には、サービス拒否 (DOS) 攻撃か、またはバリエーションとして、分散型サービス拒否 (DDOS) 攻撃と呼ばれるものがあります。 攻撃は、余分なネットワーク トラフィックでネットワークを過負荷にしようとすることで機能します。 攻撃者が被害者に十分なネットワークトラフィックを送ることができれば、被害者のネットワーク ハードウェア(モデムやルーター)は余計なトラフィックの処理にすべての時間を費やさなければならず、正規のネットワーク接続を処理する通常のジョブを実行する時間がなくなってしまいます。 実質的には、これは、攻撃を受けている間、被害を受けたユーザーが自分のネットワークを使用できないことを意味します。 これは多くの場合、「オフラインになる」と呼ばれます。

結論として、ピアの直接接続が成功すると、一部のデバイス間の待機時間が短くなる可能性があります。 ただし、これを確立しようとすると、ユーザーは IP アドレスを他のユーザーに開示する必要があります。これにより、悪意のあるユーザーがタイトル外のデバイスやインターネット接続を攻撃できる可能性があります。 また、ポリシー上の理由から、特定のプラットフォームでは許可されない場合があります。 パフォーマンスとセキュリティの目標に適した直接ピア接続オプションを必ず使用してください。 リスクを検討した上で直接ピア接続を使用する場合には、次の例を使用してネットワークごとおよびデバイスごとにタイトルをオプトインしてください。

LAN シナリオ

パーティーの直接ピア接続を使用すると、LAN シナリオで非常に短い待機時間を実現できます。 ただし、このようなシナリオでは、ユーザー認証、LiveOps データと Insights、ボイス チャットのアクセシビリティ機能をサポートするには、インターネット接続が制限されている必要があります。

アップストリーム帯域幅に関する考慮事項

ピアツーピア接続を直接使用すると、ゲームのアップストリーム帯域幅の使用量が増加する可能性があります。 クラウド リレー サービスを介してゲームまたは音声メッセージを送信する場合、パーティーからサービスに 1 つのメッセージが送信されます。サービスは、メッセージをレプリケートして各ターゲット デバイスに転送します。 直接ピア ツー ピア接続を介してゲームまたは音声メッセージを送信する場合、パーティーは、直接ピアツーピア接続が確立されているターゲット デバイスごとにメッセージをレプリケートし、直接接続を介してメッセージを送信します。 したがって、ゲームのアップストリーム帯域幅の使用量は、直接ピアツーピア接続が確立されているデバイスの数に比例してスケーリングされます。 直接ピア ツー ピア接続を有効にする前に、このアップストリーム帯域幅の増加がゲームで許容されるかどうかを検討してください。

ゲーム内でピア ツー ピアの直接接続を使用する方法

ネットワーク内でピア ツー ピアの直接接続を可能にする

PartyManager::CreateNewNetwork()を使用してネットワークを作成する場合は、呼び出しに指定された PartyNetworkConfiguration を使用して、さまざまなネットワーク構成パラメーターを指定できます。 PartyNetworkConfiguration::directPeerConnectivityOptions フィールドを使用して、ネットワーク内のデバイスに対してピアツーピアの直接接続をサポートするかどうかを指定できます。

次の例は、プラットフォームの種類やログイン プロバイダーに関係なく、ネットワーク内のすべてのデバイス間で直接ピアツーピア接続を試行する必要があることを指定するネットワーク構成を示しています。

PartyNetworkConfiguration configuration = {};
configuration.directPeerConnectivityOptions = PartyDirectPeerConnectivityOptions::AnyPlatformType | PartyDirectPeerConnectivityOptions::AnyEntityLoginProvider;
// Initialize the rest of the network configuration parameters appropriately for your game before using.

ネットワークへの初期ユーザーの正常な認証の一環として、デバイスは、ネットワーク構成によって許可されている場合に、ネットワークに既に参加している他のデバイスとのピア ツー ピア直接接続の確立を試みることができます。 成功した場合、デバイス間のエンドポイント メッセージとチャット データは、これらの直接接続を使用して送信されます。 デバイス間の環境の非互換性のために失敗した場合、それらのデバイス間のすべての通信は、代わりに透過的なクラウド リレー サーバーを介して送信されます。 デバイスがネットワーク構成によってピア接続を直接試行することが許可されていない場合、IP アドレス情報を交換することはなく、常に透過的なクラウド リレー サーバーを介してエンドポイント メッセージとチャット データを送信します。

注意

直接ピア接続の確立はベスト エフォート型であり、環境要因、デバイスごとの接続オプション、またはプラットフォーム ポリシーが原因で不可能な場合があります。 特定のデバイスに対して直接ピア ツー ピア接続が確立されたかどうかを評価する方法の詳細については、「接続の種類と待機時間の評価」を参照してください。

デバイスごとの直接ピア接続の制約

ネットワーク構成の直接ピア接続オプションに加えて、PartyManager::SetOption()を使用して PartyOption::LocalDeviceDirectPeerConnectivityOptionsMask を設定することで、認証が行われるすべてのネットワークに対するデバイスによって、直接ピア接続がさらに制限される場合があります。 すべてのフラグは、ビット単位の AND 演算を使用して評価されます。 つまり、特定のフラグは、ネットワーク構成と両方のデバイスのそれぞれのローカル マスク オプションという 3 つの場所で有効になっている場合にのみ、特定のネットワークのデバイスのペアに対して有効になります。 ネットワーク構成が、関連するフォームの直接ピア接続を許可している場合でも、どちらのデバイスも、このローカル デバイス マスクのオプションでフラグを有効にしないことで、IP アドレスの開示とデバイス間の直接接続の試行を独立してオプトアウトできます。 直接ピア接続をサポートするライブラリのバージョンでは、 PartyOption::LocalDeviceDirectPeerConnectivityOptionsMask 値は既定で、ネットワークによって有効になっているすべての直接ピア接続を許可します。 そのため、ローカル デバイスに関連する一部またはすべての直接ピア接続を防ぐために、デバイス固有の要件がある場合にのみ構成する必要があります。

次の例は、ローカル デバイスの直接ピア接続を制限して、同じプラットフォームのデバイスへの直接ピア接続の確立のみを試みる方法を示しています。

PartyDirectPeerConnectivityOptions localDeviceMask = PartyDirectPeerConnectivityOptions::SamePlatformType | PartyDirectPeerConnectivityOptions::AnyEntityLoginProvider;
PartyError error = PartyManager::GetSingleton().SetOption(nullptr, PartyOption::LocalDeviceDirectPeerConnectivityOptionsMask, &localDeviceMask);
if (PARTY_FAILED(error))
{
    printf("Failed to set local device direct peer connectivity options mask! error = 0x%08x\n", error);
}

接続の種類と待機時間を評価する

PartyNetwork::GetDeviceConnectionType() を呼び出すことで、ローカル デバイスが特定のリモート デバイスに対して直接ピアツーピア接続を確立したかどうかを確認することができます。

特定のペアのデバイスに対して直接ピアツーピア接続の可用性を積極的に適用しないことをお勧めします (つまり、PartyNetwork::GetDeviceConnectionType() が 以外の値を報告する場合は、PartyDeviceConnectionType::DirectPeerConnectionPartyNetwork::LeaveNetwork() を呼び出さないでください)。これは、使用中の特定の基になる転送メソッドによって通信の全体的な論理機能が変更されないためです。 ゲーム設計に、直接ピア接続を促進する最大メッセージ待ち時間に対する厳格な要件がある場合は、送信メカニズムに基づいて抽象的な想定を行うのではなく、PartyEndpointStatistic::AverageDeviceRoundTripLatencyInMilliseconds 統計によって報告された、その待機時間の現在の具体的な観察に対してアクションを実行することをお勧めします。 そうしないと、環境要因が制御できないので、常に近くの透明なクラウド リレー サーバーを使用する必要がある同じフレンド のセットでプレイしようとしているユーザーを絶えず妨げる可能性があります。

次の例は、network での localEndpointから remoteEndpoint へのラウンド トリップ待機時間を調べる方法を示しています。

// A helper for inspecting the connection type and average round trip latency between a local endpoint and a remote
// endpoint in a network.
void PrintConnectionTypeAndLatency(
    PartyNetwork* network,
    PartyLocalEndpoint* localEndpoint,
    PartyEndpoint* remoteEndpoint
    )
{
    // Retrieve the device associated with the remote endpoint.
    PartyDevice* remoteDevice;
    PartyError error = remoteEndpoint->GetDevice(&remoteDevice);
    if (PARTY_FAILED(error))
    {
        printf("Failed to get the remote device! error = 0x%08x\n", error);
        return;
    }

    // Get the device connection type.
    PartyDeviceConnectionType connectionType;
    PartyError error = network->GetDeviceConnectionType(remoteDevice, &connectionType);
    if (PARTY_FAILED(error))
    {
        printf("Failed to get device connection type! error = 0x%08x\n", error);
        return;
    }

    // Retrieve the latency statistic.
    PartyEndpointStatistic latencyStatistic = PartyEndpointStatistic::AverageDeviceRoundTripLatencyInMilliseconds;
    uint64_t latencyStatisticValue;
    error = localEndpoint->GetEndpointStatistics(
        1,                       // targetEndpointCount
        &remoteEndpoint,         // targetEndpoints
        1,                       // statisticCount
        &latencyStatistic,       // statisticTypes
        &latencyStatisticValue); // statisticValues
    if (PARTY_FAILED(error))
    {
        printf("Failed to get latency statistic! error = 0x%08x\n", error);
        return;
    }

    // Print the results.
    printf("Local endpoint 0x%p and remote endpoint 0x%p in network 0x%p have average round trip latency %llu ms and device connection type %i\n",
        localEndpoint,
        remoteEndpoint,
        network,
        latencyStatisticValue,
        static_cast<int32_t>(connectionType));
}

接続の種類の変更

環境の条件が変化することにより直接ピア接続が中断され、PlayFab パーティーで使用できなくなる可能性があります。 この場合、デバイスはクラウド リレー サーバーを経由した通信にフォール バックを試みます。 リレー通信が可能な場合、PartyNetwork::GetDeviceConnectionType() 関数が PartyDeviceConnectionType::RelayServer のレポートを開始し、その後デバイスは新しい接続の種類を使用してパーティー ネットワークに留まります。 それ以外の場合には、接続が中断されたデバイスはネットワークから離脱します。

Warning

中断されたときに直接ピア接続で送信中または受信中だったチャットおよびゲームのメッセージは、PartySendMessageOptions::GuaranteedDelivery を使用して送信された場合でも、PartyLocalEndpoint::GetEndpointStatistics() によって返された PartyEndpointStatistic::CurrentlyQueuedSendMessages または PartyEndpointStatistic::CurrentlyActiveSendMessages 値にカウントされなくなった場合でも、到着しない場合があります。 さらに、接続の種類の切り替え期間中に送信されたメッセージは、PartySendMessageOptions::SequentialDelivery を使用して送信された場合でも、順不同で到着する可能性があります。 直接ピア接続およびこれらの PartySendMessageOptions を使用する場合、タイトルにデータ損失や順序の誤りが発生する可能性に備えて準備しておく必要があります。

PartyDeviceConnectionType::RelayServer の接続の種類は、その値がデバイスが最初にネットワークに参加したときに割り当てられたか、または以前中断された直接ピア接続の後で割り当てられたかに関わらず、別の種類に変更されることはありません。

課金メーター

クラウド リレー サービスを使用するネットワークと同じ 課金メーター は、ピアツーピア接続を直接使用するネットワークに適用されます。 ただし、クラウド リレー サービスを通過するゲームデータまたは音声データのみが、 Network Egressパーティー音声のメーターにカウントされます。