функция 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 пытается отправить в фоновом режиме, а остальная часть программы продолжается.

Ответы на вопрос(2)

Ваш ответ на вопрос