функция recv () работает слишком медленно
Привет, я новичок в Python. Я пишу простую (не для меня) игру для локальной сети, используя модуль pygame.
Вот проблема - у меня два компьютера (один старый нетбук Intel Atom, другой Intel i5 NTB). Я хочу достичь как минимум 5 FPS (нетбук замедляет NTB, но не так сильно, теперь у меня около 1,5 FPS), но вызов функции recv () дважды, когда основной цикл занимает всего около 0,5 секунды на каждом машина. Сигнал Wi-Fi сильный, маршрутизатор 300 Мбит / с и отправляет короткую строку длиной примерно 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 кадров в секунду в левом верхнем углу карты и 25 кадров в секунду в правом нижнем углу (карта пикселей 1000x1000). содержит квадраты 5x5 пикселей, я думаю, что это медленнее из-за больших координат, но я не могу в это поверить. Кстати, прямая игра в локальной сети в правом нижнем углу карты занимает примерно столько же времени) Нетбук Atom у него 4-8 FPS.
Не могли бы вы сказать мне, почему это так медленно? Компьютеры не синхронизированы, один быстрее, другой медленнее, но не может быть, чтобы они ждали друг друга, это было бы с задержкой не более 0,17 с, верно? И плюс длительный вызов recv будет только на более быстром компьютере? Также я точно не знаю, как работает функция send / recv. Странно, что sendall занимает буквально нет времени, а получение занимает 0,5 секунды. Возможно, sendall пытается отправить в фоновом режиме, а остальная часть программы продолжается.