Python 游戏服务器 - 优化网络

标签 python networking lag

我有一个运行的 Python 游戏服务器。游戏是回合制的。玩家提示短暂的滞后峰值持续了几轮(即,他们的客户被困在等待一段时间,然后突然他们一次收到几轮值(value)的更新)。我希望找到一些方法来提高网络的一致性,但我不确定还需要做什么。

这是我正在做的:

  • 异步套接字
  • 设置了 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 个字节。有一些大小为 256 和 500-600 字节的更新(一次仅发送给 1 个玩家)。

通常一次大约有 10-50 个玩家处于事件状态,同一屏幕中的玩家不超过 10 个。


附言- 我用 PyPy 运行。我已经分析过,一切看起来都不错。所有玩家移动都在 <3 毫秒内处理,服务器大部分时间都处于空闲状态。

最佳答案

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

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

关于Python 游戏服务器 - 优化网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19716545/

相关文章:

html - CSS-:hover is slow/laggy in IE7

python - 相当于PyQt/PySide中wxPython的Freeze and Thaw

java - 为什么我的 java 制作的 pacMan 克隆有时会滞后?

python - 无法让 url 函数与 django 中的特定语法一起使用

node.js - Windows 上监听 1880 端口失败

php - sqlsrv 通过网络非常慢

java - 为什么我在通过键时得到 CancelledKeyException?

ios - 密集的数据处理使UI交互无法生效

python - 在 JSON 文件的现有列表中附加生成的对象的有效方法?

python - 使用 Datashader 从 NumPy 数组绘制数据的最佳方法是什么?