ネットワーク制限とベストプラクティス
ネットワークロジックを作る際に気をつけるべきネットワーク関連の細かな留意点。
セッションの制限事項
最適なマルチプレイ体験を実現するために、1セッションあたり5ユーザー以内、セッション時間は5分以内を推奨しています。
ネットワークセッションは、ユーザーが接続されている間は維持されますが、仕様上、長時間接続することはできません。すべてのユーザーが切断し、共有環境とのインタラクトが停止した時点でセッションを切断することをお勧めします。
メッセージの信頼性
ARDKは、IMultipeerNetworking.SendDataToPeer(s)またはBroadcastData APIによるメッセージの信頼性を完全に保証するものではありません。これらのメッセージではTCPトランスポート層を使用しますが、まれにメッセージが消失する場合があります(例: デバイスのインターネット接続が切断された場合や、サーバーへのTCP接続を再確立する場合)。
ネットワークが不安定な場合でも必ずクラウド上に保存されるため、状態情報はすべて永続的なキー値として書き込む必要があります。また、キー値ストア内のデータは、接続するタイミングにかかわらず、セッション内のすべてのピアに送信されます。
なお、数千回のセッションを実施した内部テストによると、Reliableメッセージは99.95%の信頼性で正常に受信されており、Unreliableメッセージも99%の信頼性を維持していました。
Reliableメッセージのオーバーヘッド
ReliableOrdered
や ReliableUnordered
のメッセージは UnreliableOrdered
や UnreliableUnordered
のメッセージに比べて送信にかかるオーバーヘッドが大きくなります。信頼性を重視する場合を除き、メッセージの送信には UnreliableUnordered
トランスポートタイプを使用してください。
さらに、ReliableOrdered
メッセージは、厳密な順序付けが義務付けられているため、メッセージが消失すると、それ以降 ReliableOrdered
メッセージを受信できなくなります。たとえば、メッセージ1、3、および4(2が欠落している)を受信したデバイスは、決して到着しない可能性のあるメッセージ2を待機しているため、メッセージ1のみが表示されます。
メッセージのレイテンシー
現在、Nianticではメッセージサーバーを米国西部地域に設置しています。サーバー中継されたメッセージは、現在の位置から米国西部のサーバーまで往復する必要があります。米国外のユーザーには、発生するレイテンシーがさらに大きくなる可能性があります。
メッセージサイズの制限
ARDKの各種ネットワークAPIにはメッセージサイズの制限があります。これらの制限を超えてデータを送信しようとすると、警告が表示され、メッセージは送信されません。
SendDataToPeer(s)とBroadcastData
以下のAPIを使用して送信可能な byte[] data
のサイズは、1メッセージあたり10MBに制限されています。
StorePersistentKeyValue
string key
のサイズは、1キーあたり最大4KB(UTF8でエンコードした場合)に制限されています。 byte[] value
のサイズは、1つの値につき100MBに制限されています。
ピアディスカバリーの競合状態
ARDKでは、セッション管理(接続、ピア追加、ピア削除)にサーバー権威メッセージが使用されますが、同一セッション内のピア間のデータ送信にはピアツーピアメッセージが使用されます。ARBEの実際の場所(米国西部)の都合上、サーバーメッセージの場合は数百から数千ミリ秒の遅延が生じるのに対し、ピアツーピアメッセージは数十ミリ秒と高速です(デバイスとの距離によって異なります)。
ピアAがピアBのPeerAddedイベントを受信している場合でも、ピアBはまだピアAの PeerAdded
イベントを受信していない可能性があります。このわずかな差異において、ピアAがピアBに対してピアツーピアメッセージ(ピアAから見て有効なメッセージ)を送信しようとすると、ピアBはピアAを有効なピアとしてまだ認識していないため、メッセージはドロップされます。
そのため、 PeerAdded
イベントを受信した直後にピアツーピアメッセージ(IMultipeerNetworking.SendDataToPeer)を送信することは推奨されません。代わりに、新しいピアが追加されるたびに数フレーム後に初期化メッセージが送信されるようにスケジュールを設定し、受信側でメッセージがドロップされるのを防ぎます。
再接続とホストの離脱
MultipeerNetworkingオブジェクトは、1つのセッションに参加するためにのみ使用できます。現在のセッションを離脱したら、既存のMultipeerNetworkingオブジェクトを破棄して、新しいオブジェクトを作成し、新しいセッションに参加(または前のセッションに再参加)します。
現時点では、同一ピアとしてセッションに再参加することはできません。新たに MultipeerNetworking
オブジェクトを作成し、同一セッションに参加した場合、そのデバイスは完全に新しいピアとみなされます。
ホストがセッションから離脱した場合、新しいホストは選択されません。ただし、以前に検出されたマップがある場合はセッションがタイムアウトする(すべてのピアが離脱する)まで維持されるため、新しいピアは古いマップに対してローカライズすることができます。
すべて のピアがネットワークセッションから離脱してから30秒後にセッションがタイムアウトします(タイムアウト前にこのホストなしのセッションに再参加しようとすると、意図しない動作が生じる可能性があります)。
ネットワークポート
ARDKのネットワークでは、次のネットワークポートを使用しています。
HTTPS: 8084
TCP: 6000-6005
UDP: 7000-7005
ネットワークファイアウォールを使用している環境で開発を行っている場合は、アプリでネットワークをテストするために、ARDKのポート範囲を許可するようにファイアウォールの調整が必要になる場合があります。