我正在制作游戏,我将它连接到互联网。我使用以下代码检查互联网连接:
def is_connected():
try:
host = socket.gethostbyname("www.google.co.in")
s = socket.create_connection((host, 80), 2)
return True
except:
pass
return False
当我在我的程序中执行此代码时,所以必须在一秒钟内运行60次的循环(因为我用60点击我的fpsclock)将我的fps减慢到5 fps。我认为 因为它太滞后了。 我知道这是因为这个程序在游戏循环中执行,每次更新我的屏幕时都必须运行 但是,任何人都可以为我提供替代方案。
我听说过并行编程这个术语,它可以在python中完成,但我不知道如何做到这一点,或者在我的代码中实现它的类型和位置。
答案 0 :(得分:0)
将检查连接的碎片分解为重复性较小的时间间隔,或者将其放入自己的线程或任务中。或者更好的是,不要这样做。
传统上,对网络和套接字的调用由操作系统管理。这意味着操作系统需要管理自己的东西并尝试连接到主机,然后通过此处提供的代码在此处创建每帧连接。
请注意connect()
(这可能是Python在下面使用的; BSD套接字和排序)将会做自己的网络工作。众所周知,互联网通信的速度有实际限制。您的计算机比缓慢或平庸的连接快几英里。
在我看来,最好的办法是发送数据报或建立连接。在C中,在BSD套接字下使用C函数{{1}的TCP / IP连接只有在连接关闭时才会返回0。通常,除非发生错误或连接关闭,否则连接将在TCP / IP下保持打开状态。
您没有理由每帧都要创建一个新的套接字。 TCP / IP连接流一旦创建就会保持打开状态。 UDP数据报只是一个数据包,就像从枪中射出的子弹。您需要继续建立连接的想法从一开始就存在缺陷,因为连接不是流,而是由协议管理(通常)数据包流,使其看起来像流一样。
如果你真的需要每帧继续创建一个套接字,那就在主线程之外做。我确信Python有多线程库。我建议你不要走这条路,因为共享内存可能非常复杂。网络和共享内存将成为一个令人头疼的问题。
答案 1 :(得分:0)
在这种情况下,您不需要多处理。你甚至不需要经常检查连接。每5秒一次就足够了,可能不会产生明显的差异。