次の方法で共有


Throttle

Throttle

Throttle サンプルは、送信キューを監視し、ネットワーク通信のレートを計測する方法を示す。

パス

ソース ファイル : (SDK ルート)\Samples\C++\DirectPlay\Throttle

実行可能ファイル :(SDK ルート)\Samples\C++\DirectPlay\Bin

ユーザーズ ガイド

Bin フォルダの ThrottleServer.exe をダブルクリックして、Throttle Server を起動する。ネットワークに接続するまで少し待つこと。サーバーが接続受け付けの準備ができると、ダイアログ ユーザー インターフェイス (UI) が表示される。サーバーが稼働している間、[Server Load] スライダを調整して、サーバーの処理負荷をシミュレートできる。負荷設定が大きいほど、サーバーが流入するメッセージを処理する速度は遅くなる。

サーバーを実行した後、Bin フォルダの ThrottleClient.exe をダブルクリックして、Throttle Client を起動する。クライアントは、サーバーが稼働しているホスト名またはインターネット プロトコル (IP) アドレスの入力を求める。ポート番号は固定されている。サーバーにクライアントが接続すると、サーバーは追加された接続を示し、受信したデータ量を示す。

  Internetwork Packet Exchange (IPX) サービス プロバイダを選んだ場合、Microsoft® DirectPlayreg; にアドレスの検索を実行させるには、[use DPNSVR] チェック ボックスをオンにする。

[Client] ウィンドウの [Send Interval] スライダを調整して、IDirectPlay8Client::Send の呼び出し間隔を設定できる。デフォルト設定では、サーバーの受信バッファはすぐにいっぱいになり、送信するメッセージがクライアントの送信キューに保持される。[Regulate Outgoing Rate] チェック ボックスをオンにすると、プログラムは送信するメッセージの数を計測して、キューのサイズをスライダで設定された [Max Queue Size] より小さい値に保つ。

  クライアントまたはサーバーのコントロールを調整すると、[Outgoing Data] に報告されるキュー サイズと待機がそれに対応して変更される。通常のマルチプレーヤ セッションをモデルとして、複数のクライアントを同時に接続できる。

プログラミング上の注意

アプリケーションで送信するデータの減速 (スロットリング) が必要になる理由を理解するには、DirectPlay アーキテクチャと DirectPlay サービス プロバイダを理解する必要がある。

DPN_SP_CAPS はサービス プロバイダの能力と設定の一覧を保持している。このサンプルでは、dwNumThreadsdwBuffersPerThread、および dwSystemBufferSize を取り上げている。ほとんどの伝送制御プロトコル/インターネット プロトコル (TCP/IP) セッション中、DirectPlay は受信側のシステム キューにすぐにメッセージを配信する。スレッドはシステム バッファからメッセージを取り、メッセージ ハンドラが受信できるようになるまでスレッド自体のメッセージ バッファに格納する。

スレッド バッファがいっぱいになり、システム バッファがいっぱいになると、DirectPlay はそれ以上メッセージの配信を許可しない。この場合、リモート コンピュータに十分なスペースが空くまで、そのターゲット向けのメッセージはローカル送信キューに格納される。

アプリケーションに合わせてこれらのパラメータを調整できるが、通常はバッファ サイズを増やすと、ゲームの遅延が大きくなる。したがって、これらの値の決定はサービス プロバイダに任せ、ネットワーク使用量の最適化に集中することをお勧めする。

通常、送信キューはネットワーク トラフィックの一時的なピークにのみ必要となる。しかし、プレーヤから送信するメッセージがターゲットの受信可能な速度を超えることが続く場合、送信キューは増え続ける。事前に何も対策を講じないと、送信するメッセージがすべてのキューを通過するのに数秒、あるいは数分かかることがある。この場合、実際にはゲームは終了する。

簡単な対策として、送信するメッセージにタイムアウト値を設定する方法がある。重要なメッセージの場合、タイムアウト値を大きくし、異なる優先順位を指定する。極端な状況には、メッセージがターゲットに到着する前に常にタイムアウトになる問題が発生することがある。できるだけ柔軟に対処するには、送信キューを監視し、それに従って送信するデータのレートを調整する必要もある。

このサンプルは、現在の送信キュー サイズに基づき、送信するデータの部分をブロックするという簡単な方法をとっている。データのブロックはアプリケーションが担当するため、ブロックされたデータの現行の合計を格納し、空きができたときに平均データ ブロックを送信できる。このようにすれば、重要なデータは喪失せず、重要ではない更新データは選別するか結合して、出力レートを軽減できる。