gpt4 book ai didi

Python pygame 客户端/服务器运行缓慢

转载 作者:行者123 更新时间:2023-12-04 15:29:46 26 4
gpt4 key购买 nike

我在 Youtube 上找到了一个基本的 space invaders pygame,我想修改它,以便从现在开始,服务器正在执行所有的处理和绘制,而客户端只发送键盘输入(都在本地主机上运行) .问题是在我实现了这个机制之后,游戏不再那么灵敏了。当我按下一个键到船实际移动时,它似乎有大约 1 秒的延迟(从 pycharm 启动游戏时,从 cmd 启动时更糟糕)。

我不知道为什么会这样,因为实际上没有什么繁重的事情需要处理,我真的需要你的帮助。

我还在 wireshark 中监控了以太网流量,似乎每秒发送大约 60-70 个数据包。

这是包含所有必要内容的 github 链接:https://github.com/PaaulFarcas/C-S-Game

最佳答案

我认为主循环中的这段代码是问题所在:

    recv = conn.recv(661)
keys = pickle.loads(recv)

套接字函数 conn.recv()阻塞 直到收到 661 个字节,或者有一些套接字事件(比如被关闭)。因此,您的程序正在阻塞等待数据到达的主循环的每次 迭代。

您可以根据 manual 尝试使用 socket.setblocking( False ) .

但是我更喜欢使用 select 模块 ( manual link ),因为我喜欢它提供的更好的控制级别。基本上,您可以使用它来了解是否有任何 数据到达套接字(或者是否有错误)。这为您提供了一个简单的选择读取缓冲区类型的逻辑循环:

procedure receiveSocketData
Use select on the socket, with an immediate timeout.
Did select indicate any data arrived on my socket?
Read the data, appending it to a Rx-buffer
Does the Rx-buffer contain enough for a whole packet?
take the packet-chunk from the head of the Rx-buffer
decode & return it
Else
Keep the Rx-Buffer somewhere safe
return None
Did any errors happen on my socket
clear Rx-Buffer
close socket
return error

我猜想使用一个未知大小的数据包,你可以尝试取消 pickle 它,并在成功时返回 OK……虽然这是非常低效的。我会使用固定大小的数据包和 struct 模块以网络字节顺序对其进行打包和解包。

关于Python pygame 客户端/服务器运行缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61459331/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com