私はソケット サーバーとフラッシュ ゲーム クライアントを書いています。このゲームでは、移動や回転などのリアルタイム コマンドが必要です。これらのコマンドがサーバーからクライアントにできるだけ早く送信されることが重要です。そうしないと、他のクライアントが移動/向きを変えるクライアントとの同期が大幅に失われるためです。
これは、ネーグル算術によって引き起こされる問題の例です。
注: これらのコマンドの意味を理解したい場合は、以下のコマンド表を参照してください。
最初のものは私が動かした船です(前進+右、前進は受信されましたが、右ではありません)
コマンドを送信するクライアント:
84796: Sending data: 2#4
84796: Sending data: 2#2
84904: Sending data: 2#3
84904: Sending data: 2#0
86187: Sending data: 2#4
86188: Sending data: 2#2
86374: Sending data: 2#3
86404: Sending data: 2#0
コマンドを受信するクライアント:
79244: Raw receive: 3#3#4$
79244: New command: 3#3#4
79398: Raw receive: 3#3#2$3#3#3$3#3#0$
79399: New command: 3#3#2
79399: New command: 3#3#3
79399: New command: 3#3#0
80635: Raw receive: 3#3#4$
80635: New command: 3#3#4
80908: Raw receive: 3#3#2$3#3#3$3#3#0$
80908: New command: 3#3#2
80908: New command: 3#3#3
80908: New command: 3#3#0
「瞬間」は私が言おうとしていることを意味しない奇妙な用語ですが、ここでは前のコマンドからのミリ秒単位の時間のようです
クライアント A が送信 (瞬間: 0)、クライアント B が受信 (瞬間: 0)
右折 クライアント A が送信 (瞬間: 0)、クライアント B が受信 (瞬間: 155)
クライアントAによる送信の停止(瞬間:108)、クライアントBによる受信(瞬間:0)
クライアントAが送信を停止する(瞬間:0)、クライアントBが受信する(瞬間:0)
クライアント A によって送信された転送 (瞬間: 1283)、クライアント B によって受信された (瞬間: 1236)
右折 クライアント A が送信 (瞬間: 1)、クライアント B が受信 (瞬間: 273)
クライアント A が送信した動きの停止 (瞬間: 186)、クライアント B が受信した (瞬間: 0)
クライアント A による送信の回転を停止 (瞬間: 30)、クライアント B によって受信 (瞬間: 0)
これは、コマンドに対応するコマンド テーブルです。
クライアント -> サーバー
2# (movement info)
0) now not turning
1) now turning left
2) now turning right
3) now not moving
4) now moving forward
サーバー -> クライアント
3# (movement info)
[shipId]#
0) now not turning
1) now turning left
2) now turning right
3) now not moving
4) now moving forward
つまり、"Nagle" のためにコマンドが完全に非同期になっていることがわかります。これにより、移動停止コマンドが移動開始コマンドと同時に他のクライアントによって受信され、そのプレイヤーはまったく移動しなくなります。
これが、これらのコマンドを TCP サーバーによって可能な限り高速にリアルタイムで送信する必要がある理由です。簡単な修正方法は、単に Nagle を無効にすることです。しかし、私はググってみました (tcp メッセージのパーシャルに関する彼の提案は私のシステムに実装されていますが、タイミングとは何の関係もないことに注意してください)。
この原因に対して Nagle アルゴリズムを無効にするべきではなく、代わりに他の解決策を探すべきであるというのは本当ですか? なぜだめですか)?
前もって感謝します。- トム