【问题标题】:Python Game Server - Optimizing networkingPython 游戏服务器 - 优化网络
【发布时间】:2013-11-12 01:13:07
【问题描述】:

我有一个 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 次更新。更新的长度通常约为

一次通常有大约 10-50 名玩家活跃,同一屏幕中的玩家不超过 10 人。


附: - 我用 PyPy 运行。我进行了分析,一切看起来都很好。所有玩家的移动都在

【问题讨论】:

  • TCP_NODELAY 对此太过分了,它实际上可能会提高您重新启用它的性能,因为它允许 tcp 不那么频繁地发送更大的数据包(更少的数据包检查等待,更少的数据包丢失的机会,更少的开销) .
  • 感谢 Serdalis 的反馈。

标签: python networking lag


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-16
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 2017-10-09
    • 2014-04-12
    相关资源
    最近更新 更多