7.20. 応用機能 - ビットレート判定機能

ビットレート判定機能とは、アップリンク方向の通信回線のデータ転送容量(ビットレート)がアプリケーションの要求水準を満たすかどうかを判定する機能です。

動作の概要

  1. アプリケーションは、快適な動作のために必要となるビットレートの下限値と、測定時に送受信する IP パケットサイズをセッションのスタートアップ時に指定します。IP パケットサイズは、アプリケーションが送受信する IP パケットの平均的なサイズを指定します。
  2. 新規参加ステーション(C) は、参加済みステーションのうち1台(S)に向けて数秒間、データを連続送信します。このときのデータ送信ペースは、アプリケーションが指定したビットレートを数割ほど上回るものとなります。
  3. S は C からのデータを数秒間を受信し、ビットレートを算出します。
  4. S は算出したビットレートを C に通知します。
  5. C が S からの通知を受けとると、C で動作しているアプリケーションは自ステーションのビットレートを GetUplinkBitRate() で取得できるようになります。

ビットレート取得後の対応

測定されたビットレートがアプリケーションの要求水準に満たなかったとしても、Pia はそのステーションの参加を妨げません。要求水準に満たなかったステーションの扱いはアプリケーションに委ねられます。

警告:

ビットレートなどの通信環境を元に、プレイヤーがゲームに参加することを制限する場合は事前に弊社にご相談ください。

コーディングサンプル

以下にビットレート判定機能の使用方法を示します。

ビットレート判定機能の使用の有無は Session インスタンス作成時に指定します。

コード 7-43. ビットレート判定機能を利用
nn::pia::session::Session::Setting sessionSetting;
sessionSetting.bitRateCheckMode = nn::pia::session::BitRateCheckMode_Enable; // ビットレート判定機能を利用
   .
   .
   .
nn::pia::session::Session::CreateInstance(setting);

 

アプリケーションが要求するビットレートの下限値と、ビットレート測定時に送信する IP パケットサイズは、Session のスタートアップ時に指定できます。

ビットレート判定機能有効時に、Session インスタンスを破棄せずにビットレート判定を行わないようにしたい場合には isBitRateCheckSkipped メンバ変数を true に設定します。これによりセッション参加処理中に行われるビットレート判定処理をスキップできます。スキップした場合、GetUplinkBitRate() で取得できるビットレート値が更新されず、最後にビットレート判定を行った際の値が返ります。

bitRateMeasuringSpan メンバ変数で測定処理を行う時間を指定することも可能ですが、長い時間を設定するとセッション参加処理の完了に必要な時間が増大するのでデフォルト値をそのまま利用することをお勧めします。

コード 7-44. アプリケーションが要求するビットレート下限値と、IP パケットサイズの指定(インターネットマッチメイク時)
nn::pia::inet::NexSessionStartupSetting startupSetting;
startupSetting.uplinkBitRateLowerLimit = 200 * 1000; // アプリケーションが要求するビットレート。単位は bps。
startupSetting.bitRateCheckPacketSize = 1024; // ビットレート測定時に送信する IP パケットサイズ。単位はバイト。
startupSetting.isBitRateCheckSkipped = false; // ビットレート判定処理をスキップするかどうか。
startupSetting.bitRateMeasuringSpan = 1000; // ビットレート測定にかける時間。単位は msec。
    .
    .
    .
nn::pia::session::Session::GetInstance()->Startup(startupSetting);

 

ビットレートの測定処理が終了すると、Session::IsBitRateCheckCompleted() が true を返します。このタイミングで Session::GetUplinkBitRate() を呼び出します。得られる値の単位は bps です。

もし相手からの応答がなかった等の理由で測定値が得られなかった場合は、ビットレートとして負の値がセットされます。

コード 7-45. ビットレートを取得
nn::pia::session::Session* pSession = nn::pia::session::Session::GetInstance();
if (PIA_IS_VALID_POINTER(pSession))
{
    if (pSession->IsBitRateCheckCompleted())
    {
        int32_t bitRate = 0;
        nn::pia::Result r = pSession->GetUplinkBitRate(&bitRate);
        if (r.IsSuccess())
        {
            PIA_SAMPLE_PRINT("bitRate: %d\n", bitRate); // 測定値が得られなかった場合は、負の値がプリントされます。
        }
    }
}

注意事項

  • この機能を利用する場合、セッションへの参加に要する時間は数秒ほど長くなり、Pia のメモリ消費量も数 KB ほど増加します。
  • 新ステーションが参加する際に、既存のステーション同士が大量の通信を行っていると、判定の精度が下がることがあります。
  • GetUplinkBitRate() で得られるビットレートは、必ずしも通信回線の実力を示すものとはなりません。測定において送受信するデータ量は、アプリケーションが指定した要求水準を少し上回る程度の量ですので、  高ビットレートな環境であっても、アプリケーションが低めのビットレートを指定していたならば、低めのビットレートが返されます。
  • ビットレート測定用パケットが送信先ステーションに到達するまでの経路に、送信元ステーションのアップリンク方向のビットレートを下回るボトルネックが存在していた場合は、GetUplinkBitRate() が過小な値を返すことがあります。