12.2. NEX NetZ と PiaSession の違い

はじめに

この章では NEX NetZ と PiaSession の違いについて説明します。

PiaSession は、NEX NetZ に相当する P2P セッション管理機能と NEX マッチメイクに相当するマッチメイクセッション管理機能を提供します。PiaSession の API 名は、NetZ からの移行がしやすいように同様の命名規則を用いていますが、内部実装は全く異なり、様々な改善を行っています。

NEX NetZ からの変更点

マッチメイク処理の自動化

NetZ では P2P メッシュネットワーク(P2P セッション)の管理とは別に NEX マッチメイク API を使用してマッチメイクセッションの管理を行う必要がありました。PiaSession では P2P メッシュネットワークとマッチメイクセッション管理を合わせて「セッション」と呼び、NEX マッチメイク API を内部で呼び出すことでマッチメイク処理が自動的に行われます。

内部仕様のシンプル化

NetZ では全てのセッション処理が複製オブジェクト間通信として行われていました。処理は多層的となり、接続/切断時には、複製オブジェクトの複雑な処理が行われることになります。一方、PiaSession では、Pia のプロトコル機能を利用したシンプルなプロトコルの組み合わせで全ての処理が行われます。疎結合設計(loose-coupling design)と高度な最適化により、多数台接続時においても高い性能と品質を実現しています。

通信中の動的メモリ確保の廃止

NetZ では通信中に動的メモリ確保が行われるため、メモリ使用量を事前に知ることができませんでした。通信環境が悪くなったときにはメモリが大量に確保され、ヒープ領域が不足するとゲームが継続できなくなります。PiaSession では初期化時にメモリ使用量を確定させる設計となっているため、通信中に新たなメモリ確保が発生することはありません。通信環境が悪くなっても、一時的に通信が滞るだけとなり、ゲームを継続することができます。

セッション構築/参加

セッション構築/参加については Session シングルトンを使用して操作します。NetZ の JoinSession の呼び出し方と同様になります。

セッション破棄/離脱

NetZ では NetZ インスタンスを破棄することで自動的にセッション破棄/離脱が行われますが、PiaSession ではセッション離脱 API の LeaveSessionAsync() を明示的に呼ぶ必要があります。また、PiaSession では多数台接続時においても、離脱時間(離脱完了までにかかる時間)が長くならないように設計されています。

送信処理

PiaSession では、目的に応じた「プロトコル」のインスタンスを使用して送受信処理を行います。具体的には、トランスポート層となる PiaTransport の UnreliableProtocol / ReliableProtocol などを使用することにより、NetZ の DirectStream の Send と同じ呼び出し方で送信処理が行えます。

受信処理

PiaTransport の UnreliableProtocol / ReliableProtocol の受信処理は、NetZ の DirectStream と同様に、受信データをアプリケーションから取得する(ポーリング) API  を使用します。NetZ の DirectStream では、前回の受信 API 呼び出しから今回の受信 API 呼び出しまでの間に受信したデータを 1 回の受信 API 呼び出しでまとめて取得する仕様となっています。 一方 PiaTransport の UnreliableProtocol / ReliableProtocol では受信データが返らなくなるまで受信 API を繰り返し呼び出す仕様になっています。

リライアブル送信バッファの分離

NetZ ではリライアブル送信バッファがあふれた場合、ライブラリ内の処理が継続できなくなるため、ゲームが継続できませんでした。PiaSession では リライアブル通信処理がアプリケーションとライブラリで分離されています。ライブラリ用リライアブル送信バッファがあふれた場合、ライブラリ内で送信を延期することで処理を継続しています。アプリケーション用リライアブル送信バッファがあふれた場合については、アプリケーションが選択することができ、送信を延期すればゲームを継続することができます。

ステーション ID

NetZ の DirectStream ではステーションの識別子として複製オブジェクト ID(nex::ConnectionID)を使用していました。PiaSession ではステーションの識別子としてステーション ID を使用します。Pia の ステーション ID は 0 から「接続台数 - 1」までの範囲の値となるステーションインデックスに変換することができます。 ステーションインデックスにより、配列のインデックスとして使用することが可能です。

通信量の削減

NetZ ではセッション参加時や離脱時に複製オブジェクトの同期処理(マイグレーションなど)のための多数の通信が発生していました。PiaSession では、参加/離脱時の通信安定化のため通信量が抑えられています。

CPU 負荷の削減

NetZ では多数台接続時などに CPU 負荷がボトルネックとなっていました。PiaSession は CPU 負荷を抑えた設計となっており、NetZ と比較して大きく改善されています。

メモリ使用量の削減

PiaSession は NetZ と比較して少ないメモリ使用量で動作します。トランスポート層となる PiaTransport の各バッファサイズを設定することにより、メモリ使用量を必要最低限に調節することができます。ただし、リライアブル通信を多用するアプリケーションでは、送信バッファの分離が行われているため、バッファサイズなどの設定によってはメモリ使用量が NetZ より大きくなることがあります。

NAT トラバーサル成功確率の改善

PiaSession では EDM(Endpoint Dependent Mapping)回線が含まれる場合の NAT トラバーサル成功確率や NAT トラバーサル失敗時の待ち時間が大きく改善されています。また、同じ回線に直列に接続した複数のルータ間でも NAT トラバーサルを実現しています。(詳細は12.1. NAT トラバーサル参考情報を参照してください。)

複製オブジェクト

Pia には NetZ の複製オブジェクトに相当する PiaClone が用意されています。PiaClone では状態同期通信ゲームで必要となる様々な状態同期機能(イベント、排他制御など)が用意されています。

推測航法

Pia には NetZ の推測航法機能に相当する PiaReckoning が用意されています。PiaReckoning には 3 次元位置情報の推測ストラテジーがあらかじめ用意されており、ゲームの仕様に応じてカスタマイズ可能です。

NEX NetZ から変わらないもの

サーバーサービスとの連携方法

マッチメイク以外のサーバーサービスとの連携方法は NetZ と同じとなります。PiaSession に移行するために NEX のログイン、ランキング、データストアなどの呼び出し部分を変更する必要はありません。