我有一个 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() 会更好吗?
我可以在 linux (Ubuntu) 主机上检查或调整什么吗?
数据迟到客户似乎存在一些问题。任何人都可以为调试此问题提供任何建议吗?
关于发送的消息:
如果玩家处于空闲状态,他们通常每回合会收到 0-3 次更新。如果一个玩家与其他玩家正在行动,他们通常会在屏幕上收到每个其他玩家 2-3 次更新。更新的长度通常约为 <20 字节。有几个更新(一次只发送给 1 个玩家)大小为 256 和 500-600 字节。
一次通常有大约 10-50 名玩家活跃,同一屏幕中的玩家不超过 10 人。
PS - 我用 PyPy 运行。我进行了分析,一切看起来都很好。所有玩家移动都在 <3 毫秒内处理,并且服务器大部分时间都处于空闲状态。