次の方法で共有


ネットワーク使用量の最適化

ネットワーク使用量の最適化

快適なゲーム体験の提供とは、通常、最新情報やその他の情報を、ターゲットの処理能力を超えない範囲で、できる限り速く送信することを意味する。Microsoft® DirectPlay® プロトコルと非同期メッセージングを組み合わせると、メッセージング方法を動的に最適化して、ユーザーに快適なゲーム体験を提供することができる。

メッセージングの大半では、IDirectPlay8Peer::SendToIDirectPlay8Client::Send、または IDirectPlay8Server::SendTo メソッドを使う。これらのメソッドは、通常、メッセージ カテゴリに関係なく非同期に動作する。メソッドはすぐに戻り、メッセージが実際に送信されると、メッセージ ハンドラは DPN_MSGID_SEND_COMPLETE メッセージを受信する。一方、DPNSEND_SYNC フラグを設定すれば、メッセージを同期で送信できる。その場合、メソッドはメッセージが実際に送信されるまでブロックする。

DirectPlay プロトコルのスロットリング メカニズムでは、クライアントの処理能力を超える速度でメッセージが渡されないことが保証される。ただし、流出用のキューにメッセージが入る頻度は制御されない。このため、未送信メッセージのキューに大量のメッセージが溜まってしまうことがある。この状況はメッセージの送信頻度を抑えることによって避けることができるが、こうするとユーザーに提供されるゲーム体験の品質が不必要に低下しかねない。最もよいメッセージング方法は、ターゲットの処理能力を超えない範囲で、メッセージをできる限り速く送信することである。

メッセージング方法を最適化するためのヒントは、以下のようになる。

  • メッセージはできる限り非同期で送信する。メッセージを同期で送信すると、スロットリング メカニズムがメッセージの送信を許すまで、メソッドがブロックする。
  • 未処理メッセージ キューとネットワーク統計情報を監視する。キューにメッセージが少ないか、またはまったくない場合は、伝送速度を上げる。キューが大きいか、または急速に巨大化している場合は、伝送速度を下げ、できれば一部のメッセージを取り消す。送信タイムアウトの詳細については、「送信の優先順位付け」を参照すること。
  • プレーヤごとに未処理メッセージ キューを分析する。メッセージの受信速度には、プレーヤごとに相当な差があるかもしれない。その場合、一括の統計情報は参考にならない。グループへの送信ではなく、指名による送信を検討する。
  • 個々のメッセージに適したカテゴリを選択する。オーバーヘッドが最も大きいカテゴリは、最も重要なメッセージのために予約する。
  • メッセージに優先順位を付けて、最も重要なメッセージが、比較的重要でないメッセージのために遅れることなく、即座に送信されるようにする。
  • 未処理メッセージ キューが大きくなりすぎないようにする。未処理のメッセージが多いと、メッセージの伝送が遅れるだけでなく、メモリ リソースが大量に消費されることもある。
  • Send および SendTo メソッドのタイムアウト機能を使って、未処理メッセージ キューから古いメッセージを自動的に消去する。
  • メッセージあたりのデータ量を最小限に抑える。通常、大きいメッセージを少数送信するよりは、小さいメッセージを頻繁に送信した方がよい。
  • 未処理メッセージ キューを調べるときに、ループの間隔をあまり短くしないこと。間隔の短いループは、CPU サイクルの無駄である。代わりに、通常どの程度の時間で次の送信ができるようになるかを予想し、その時間スリープする方がよい。