良い一日を!
私はクローズド ソースのゲームのオープン ソース サーバーに取り組んでいます - ゲームは TCP/IP ソケットを使用して動作します (UDP の代わりに、doh...)。
私の現在のプログラム構造(ダムダウン):
コアスレッド
- 新しい接続を受け取り、新しいクライアント オブジェクトを作成します。
クライアント オブジェクト
IOloop (独自のスレッドで実行)
- ソケットからデータを取得し、パケットを処理します。(一度に 1 パケット)
- 他のスレッドからバッファリングされたデータを送信 (一度に 1 パケット)
クライアントが独自のスレッドである場合、クライアントはすぐに (遅延なしで) データを送信します。
プログラムに大きな欠陥があることに気付きました。主に、データの送信が非常に遅いです。同期的に、パケットごとにデータを送信するためです。(Socket.Send(byte[] バッファ))
データを遅滞なく、非同期で、すぐに送信したいと考えています。
パケットを送信するたびに新しいスレッドを作成しようとしました (そのため、各パケットは独自のマネージド スレッドで送信されます) が、これは非常に面倒でした。
私の現在のシステムは、nagle アルゴリズムを無効にした同期送信を使用していますが、これにはボトルネックの欠陥があります。1 つのパケットを送信し、TCP が確認するまで操作ブロックを送信してから、次のパケットを送信します... 100 ミリ秒ごとに 10 パケットを簡単に発行できます。パケットの送信には 400 ミリ秒かかり、これがバックアップして壊れます。もちろん、ローカル ホストではこの問題は発生しません。
それで、私の質問: データの複数の小さなパケットを送信する最良の方法は何でしょうか? 前後の遅延を減らすために、すべての IO スレッド ループの最後に送信するデータを 1 つの大きなバイト バッファーにマージすることを考えています。遅れます。
同期送信はどのように機能しますか? 私が信じているように、データが受信者によって正しく受信されたことを確認するまでブロックしますか? 確認を待たずにこれを行う方法はありますか? パケットはすべて順番どおりに正しく送信する必要があることは理解しています (プロトコル仕様に従って)。