Python ゲームサーバーを実行しています。ゲームはターン制です。プレイヤーは、数ターン続く短いラグ スパイクについて不満を漏らします (つまり、クライアントがしばらく待機していた後、突然、数ターン分の更新を一度に受け取ります)。ネットワークの一貫性を改善する方法を見つけたいと思っていますが、やるべきことが残っているかどうかはわかりません。
これが私がやっていることです:
- 非同期ソケット
- TCP_NODELAY フラグが設定されています
- ポーリングのための epoll
再生を受け取る方法は次のとおりです。
for (fileno, event) in events:
if fileno == self.server_socket.fileno():
self.add_new_client()
elif event & select.EPOLLIN:
c = self.clients[fileno]
c.read() # reads and processes all input and generates all output
...
そして、これが私が更新を送信する方法です:
if turn_finished:
for user in self.clients.itervalues():
for msg in user.queued_messages:
msg = self.encode(msg)
bytes_sent = user.socket.send(msg)
...
ソケットへの書き込みまたはソケットからの読み取りを行うたびに、すべてのバイトが送信されたことを確認し、ソケット エラーがあればログに記録します。これらはほとんどログに表示されません。
socket.send() 呼び出しを 1 回だけ実行した方がよいでしょうか?
Linux (Ubuntu) ホストで確認または調整できることはありますか?
クライアントにデータが遅れて到着するという問題があるようです。この問題をデバッグするための提案はありますか?
送信されたメッセージについて:
プレーヤーがアイドル状態の場合、通常、1 ターンに 0 ~ 3 回の更新を受け取ります。プレーヤーが他のプレーヤーとのアクションの最中にある場合、通常、画面上の他のプレーヤーごとに 2 ~ 3 の更新を受け取ります。通常、更新の長さは約 20 バイト未満です。サイズが 256 および 500 ~ 600 バイトの更新がいくつかあります (一度に 1 人のプレーヤーにのみ送信されます)。
通常、一度にアクティブなプレイヤーは約 10 ~ 50 人で、同じ画面には 10 人以下です。
PS - 私は PyPy で実行します。私はプロファイルを作成しましたが、すべてがよさそうです。すべてのプレーヤーの動きは 3 ミリ秒未満で処理され、サーバーはほとんどの時間アイドル状態になります。