嗨,我是 Python 的新手。我使用 pygame 模块编写了一个简单的 LAN 游戏(对我来说并不简单)。
这就是问题所在 - 我有两台电脑(一台旧英特尔 Atom 上网本,另一台英特尔 i5 NTB)。我想达到至少 5 FPS(上网本正在减慢 NTB,但不是那么多,现在我有大约 1.5 FPS),但是在主循环中调用 recv() 函数两次总共需要大约 0.5 秒机器。wifi 信号很强,路由器是 300Mbit/s,它发送一个大约 500 个字符的短字符串。如您所见,我使用 time.clock() 来测量时间。
这是我通常在 i5 NTB 上运行的“服务器”代码的一部分:
while 1:
start = time.clock()
messagelen = c.recv(4) #length of the following message (fixed 4 character)
if " " in messagelen:
messagelen = messagelen.replace(" ","")
message = cPickle.loads(c.recv(int(messagelen))) #list of the arrows, other player position and changes in the game map
arrowsmod = message[0]
modtankposan = message[1]
removelistmod = message[2]
for i in removelistmod:
try:
randopos.remove(i)
except ValueError:
randopossv.remove(i)
print time.clock()-start
tosendlist=[]
if len(arrows) == 0: #if there are no arrows it appends only an empty list
tosendlist.append([])
else:
tosendlist.append(arrows)
tosendlist.append([zeltankpos, 360-angle])
if len(removelist) == 0: #if there are no changes of the map it appends only an empty list
tosendlist.append([])
else:
tosendlist.append(removelist)
removelist=[]
tosend=cPickle.dumps(tosendlist)
tosendlen = str(len(tosend))
while len(tosendlen)<4:
tosendlen+=" "
c.sendall(tosendlen) #sends the length to client
c.sendall(tosend) #sends the actual message(dumped list of lists) to client
...something else which takes <0,05 sec on the NTB
这是“客户端”游戏代码的一部分(只是将开头颠倒了 - 发送/接收部分):
while 1:
tosendlist=[]
if len(arrows) == 0: #if there are no arrows it appends only an empty list
tosendlist.append([])
else:
tosendlist.append(arrows)
tosendlist.append([zeltankpos, 360-angle])
if len(removelist) == 0: #if there are no changes of the map it appends only an empty list
tosendlist.append([])
else:
tosendlist.append(removelist)
removelist=[]
tosend=cPickle.dumps(tosendlist)
tosendlen = str(len(tosend))
while len(tosendlen)<4:
tosendlen+=" "
s.sendall(tosendlen) #sends the length to server
s.sendall(tosend) #sends the actual message(dumped list of lists) to server
start = time.clock()
messagelen = s.recv(4) #length of the following message (fixed 4 character)
if " " in messagelen:
messagelen = messagelen.replace(" ","")
message = cPickle.loads(s.recv(int(messagelen))) #list of the arrows, other player position and changes in the game map
arrowsmod = message[0]
modtankposan = message[1]
removelistmod = message[2]
for i in removelistmod:
try:
randopos.remove(i)
except ValueError:
randopossv.remove(i)
print time.clock()-start
... rest which takes on the old netbook <0,17 sec
当我在 i5 NTB 上的一台机器(没有插座模块)上运行游戏的单人版本时,它在地图的左上角有 50 FPS,在右下角有 25 FPS(1000x1000 像素地图包含 5x5 像素方块,我认为它会因为更大的坐标而变慢,但我不敢相信这么多。顺便说一句,在地图右下角作为 LAN 游戏运行时,recv 大约需要相同的时间) Atom上网本它有4-8 FPS。
那你能告诉我,为什么它这么慢吗?计算机不同步,一个更快,另一个更慢,但不可能是他们在等待对方,这将是最大 0,17 秒的延迟,对吧?再加上长时间的 recv 调用只会在速度更快的计算机上?我也不完全知道发送/接收功能是如何工作的。奇怪的是 sendall 实际上不需要时间,而接收需要 0.5 秒。也许 sendall 正试图在后台发送,而程序的其余部分继续前进。