ネットワーク使用量の最適化
ネットワーク使用量の最適化
快適なゲーム体験の提供とは、通常、最新情報やその他の情報を、ターゲットの処理能力を超えない範囲で、できる限り速く送信することを意味する。Microsoft® DirectPlay® プロトコルと非同期メッセージングを組み合わせると、メッセージング方法を動的に最適化して、ユーザーに快適なゲーム体験を提供することができる。
メッセージングの大半では、IDirectPlay8Peer::SendTo、IDirectPlay8Client::Send、または IDirectPlay8Server::SendTo メソッドを使う。これらのメソッドは、通常、メッセージ カテゴリに関係なく非同期に動作する。メソッドはすぐに戻り、メッセージが実際に送信されると、メッセージ ハンドラは DPN_MSGID_SEND_COMPLETE メッセージを受信する。一方、DPNSEND_SYNC フラグを設定すれば、メッセージを同期で送信できる。その場合、メソッドはメッセージが実際に送信されるまでブロックする。
DirectPlay プロトコルのスロットリング メカニズムでは、クライアントの処理能力を超える速度でメッセージが渡されないことが保証される。ただし、流出用のキューにメッセージが入る頻度は制御されない。このため、未送信メッセージのキューに大量のメッセージが溜まってしまうことがある。この状況はメッセージの送信頻度を抑えることによって避けることができるが、こうするとユーザーに提供されるゲーム体験の品質が不必要に低下しかねない。最もよいメッセージング方法は、ターゲットの処理能力を超えない範囲で、メッセージをできる限り速く送信することである。
メッセージング方法を最適化するためのヒントは、以下のようになる。
- メッセージはできる限り非同期で送信する。メッセージを同期で送信すると、スロットリング メカニズムがメッセージの送信を許すまで、メソッドがブロックする。
- 未処理メッセージ キューとネットワーク統計情報を監視する。キューにメッセージが少ないか、またはまったくない場合は、伝送速度を上げる。キューが大きいか、または急速に巨大化している場合は、伝送速度を下げ、できれば一部のメッセージを取り消す。送信タイムアウトの詳細については、「送信の優先順位付け」を参照すること。
- プレーヤごとに未処理メッセージ キューを分析する。メッセージの受信速度には、プレーヤごとに相当な差があるかもしれない。その場合、一括の統計情報は参考にならない。グループへの送信ではなく、指名による送信を検討する。
- 個々のメッセージに適したカテゴリを選択する。オーバーヘッドが最も大きいカテゴリは、最も重要なメッセージのために予約する。
- メッセージに優先順位を付けて、最も重要なメッセージが、比較的重要でないメッセージのために遅れることなく、即座に送信されるようにする。
- 未処理メッセージ キューが大きくなりすぎないようにする。未処理のメッセージが多いと、メッセージの伝送が遅れるだけでなく、メモリ リソースが大量に消費されることもある。
- Send および SendTo メソッドのタイムアウト機能を使って、未処理メッセージ キューから古いメッセージを自動的に消去する。
- メッセージあたりのデータ量を最小限に抑える。通常、大きいメッセージを少数送信するよりは、小さいメッセージを頻繁に送信した方がよい。
- 未処理メッセージ キューを調べるときに、ループの間隔をあまり短くしないこと。間隔の短いループは、CPU サイクルの無駄である。代わりに、通常どの程度の時間で次の送信ができるようになるかを予想し、その時間スリープする方がよい。