2

我有一个 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 毫秒内处理,并且服务器大部分时间都处于空闲状态。

4

1 回答 1

0

听起来您需要调试客户端并找出它在“卡住”时在做什么。

只有了解了原因,才能找到解决办法。

于 2013-11-01T14:23:02.850 回答