CTR-Pia
5.4.3
Game Communication Engine
|
nn::pia::transport の ReliableProtocol と UnreliableProtocol の使用方法を解説するためのデモです。
このサンプルデモは、以下の項目に関するデモです。
通信のモードを選択する画面です。 選択するとマッチメイクが行われた後メイン画面に移行します。
入力 | 動作 |
---|---|
A ボタン | ローカル通信 (UDS) のホストとして実行します。セッションを作成後メイン画面に移行します。 |
B ボタン | ローカル通信 (UDS) のクライアントとして実行します。 UDS ネットワークを検索して発見したものに参加し、メイン画面に移行します。 UDS ネットワークを検索中に START ボタンを押すと、検索を中断してモード選択画面に戻ります。 |
X ボタン | インターネット通信を使うモードで実行します。 ランダムマッチメイクを行い、参加できるセッションがあればそこにクライアントとして参加、無ければホストとしてセッションを作成します。 その後、メイン画面に移行します。 |
START ボタン | アプリケーションを終了します。 |
セッション内の各ステーションに対して、3つのプロトコルを使ってデータを送信することができます。
メイン画面中は、他の機器が任意のタイミングでセッションに参加、離脱が可能です。
エラーが発生するなどセッションを継続できない場合は、自動的にモード選択画面に戻ります。
画面内で縦に並んでいるのは、セッションに参加しているステーションの情報です。
ID の欄がステーション ID を表しています。 左に「*」がついているステーションがセッションのホストを表します。 (このサンプルでは必ず0番がホストになります。)
グレーの文字で "me" と表示されているものが、自分自身を表します。 自分自身に関してはこれ以上の情報はありません。
グレーの文字で "disconnect" と表示されているものは、そのステーション ID に相当するステーションがセッション内に存在しないことを表します。
一番下の ID が "All" となっている行は、セッションに参加しているステーション全員に送信を行う際の情報を表します。
横に並んでいる "Unreliable", "Reliable", "ReliableLarge" はプロトコルを表します。 (各プロトコルの概要は後述します。)
接続しているステーションに対しては、各プロトコルに対して 2 つずつ数字が表示ます。 上側がそのステーションに対して送信を行った数、下側がそのステーションからの受信した数です。
All の行に関しては、送信しかできないため受信回数の表示は無く、送信回数だけが表示されます。
一番右側の "RTT" の列には、そのステーションに対する RTT (Round Trip Time) と、 その RTT 算出に使われた RTT サンプリング値の個数が表示されます。
画面下方には、自ステーションが送受信に成功したパケット数およびデータサイズのそれぞれの総計が表示されます。
入力 | 動作 |
---|---|
十字ボタン | カーソル(頭に ">" が付きピンク色で表示されます)を移動させます。 |
A ボタン | 現在カーソルがあるステーション、プロトコルで1回送信を行います。 送信が成功すると、送信回数が 1 増えます。 |
X ボタン | 現在カーソルがあるステーション、プロトコルで、毎フレーム1回ずつ送信する機能の ON / OFF を切り替えます。 この機能が ON になっている時は送信回数の右側に "@" が表示され、送信が成功するたびに送信回数が 1 増えます。 |
Y ボタン | 送受信時のコンソール出力の ON / OFF を切り替えます。 release ビルドではこの設定にかかわらず出力されません。 |
START ボタン | セッションから離脱してモード選択画面に戻ります。 セッションホストだった場合はセッションが終了するので、セッションに入っていた他の機器もモード選択画面に戻ります。 |
このサンプルでは、以下の3つのプロトコル(通信方式)を並行して動作させています。
Pia では、送りたいデータの特徴や要求仕様に応じて、さまざまなプロトコルを組み合わせて使用することができます。
UnreliableProtocol を使ってデータを送信します。
個々のステーション宛ての送信では 40 バイト程度のデータを、 "All" 宛ての送信では、 UnreliableProtocol で送信できる最大サイズ UnreliableProtocol::GetDataSizeLimit の データを送信しています。
UnreliableProtocol では データの到達が保証されないため、パケットロスが発生した場合には、送信数より受信数が小さくなります。
ReliableProtocol を使ってデータを送信します。
1 回の送信につき 30 バイト程度のデータを送信します。
ReliableProtocol では データの到達が保証されるため、パケットロスが発生したとしても送信数と受信数が一致します。 ただし、パケットロスが発生した場合などは送信の遅延が大きくなるため、 送信数と受信数が一致するまでに時間がかかる場合があります。
Reliable と同様、 ReliableProtocol を使ってデータを送信します。
1 回の送信につき、最大で 1MB のランダムな値のデータを送信します。 具体的には、 50% の確率で 1MB のデータを、残りの 50% の確率で 4B ~ 1MB のランダムなサイズのデータを送信します。
大きなデータを送受信するために、多くのバッファを必要とします。
大きいデータを送信する場合は、パケットロスが発生しなかったとしても送信したデータが到達するまで時間がかかります。 その間送信バッファも適宜占有することになるため、毎フレーム送信するようにしても送信が成功しない状況になり、 送信数がなかなか増えていかないという挙動をしますが、これは正常な動作です。
Reliable と ReliableLarge は、同じ ReliableProtocol を ポートを分けることで共存させています。
このようにすることで受信時にあらかじめどちらのデータか区別できるため、その後の処理を区別したい場合や、 このサンプルのようにデータのサイズに大きな違いがある場合などに便利です。
ただし、プロトコルを分けることにより、それぞれのプロトコルが必要とするメモリはそれぞれかかってきますのでご注意ください。
このサンプルでは、それぞれの毎フレーム送信を ON にすることにより一度にたくさんのデータを送受信できる仕様になっていますが、 実際に送受信できるデータ量はそれほど多くありません。 そのため、一度にたくさんの送受信をしようとしても送受信が滞る事になります。
このサンプルは、TransportAnalyzer を用いたトランスポート解析機能を有効にした状態で動作させており、メイン画面では定期的に解析データをログに出力しています。 解析データには Pia のパケット内訳やパケット数、パケロス率、RTT 等が含まれており、このログファイルを tools/TransportAnalyzer/PiaTransportAnalyzer.xlsm に読み込ませると、時間経過に伴う通信状況の変化をグラフ化して表示することができます。