Puede encontrar un código de error muy bueno que indique que winsock recv es lento. Hay varias formas de permitirles resolver este problema, y ​​deberíamos solucionarlo en breve.

Hola, soy nuevo en Python. Soy un juego de LAN simple adecuado (no es fácil para mí) con el módulo pygame.

Aquí hay un dilema: tengo dos computadoras (una netbook Intel Atom y la otra Apple i5 NTB). Quiero ahorrar al menos una cantidad de 5 fotogramas por segundo (la computadora ralentiza NTB, pero no tanto, tengo hasta 1,5 fotogramas por segundo), pero doblo recv () dos veces, una parte similar al bucle principal toma 0 directamente a 5 segundos. cada unidad. Incluimos una señal wifi fuerte, el hub tiene una velocidad de 300 Mbps, y este tipo envía un mensaje cercano de unos 500 caracteres. Como puedes ver, eres la aplicación de i time.clock ().

para tomar medidas de tiempo

Aquí está la regla “del lado del servidor” que suelo ejecutar en cualquier i5 NTB:

  para 1:    el inicio es igual a la hora. reloj ()    messagelen significa c.recv (4) # longitud que apunta al siguiente mensaje de voz (10 caracteres fijos)   en "" Messagelen:        Messagelen significa Messagelen.replace ("", "")    point CPickle = .massive (c.recv (int (messagelen))) # Lista con la mayoría de flechas, posición de otros guitarristas y evolución en el mapa de actividades    arrowmod = experiencia [0]    modtankposan es igual a mensaje [1]   Removelistmod es igual a Mensaje [2]    debido a mí en Removelistmod:        Tratar:             eliminar caminatas (i)        excepto ValueError:            sacar randoss. (Yo soy)    pic time.clock () - inicio    tosendlist = []    Suponga que len (flechas) == 0: # si normalmente no hay flechas, generalmente se agrega una lista vacía        tosendlist.append ([])    otro:       Para enviar la lista .append (flechas)    tosendlist.append ([zeltankpos, 360-Winkel])    if len (removelist) == 0: # si es muy posible que no haya botones en el mapa, generalmente se agrega una fantástica lista vacía        tosendlist.append ([])    otro:       Tosendlist .append (eliminar lista)        lista de eliminación = []    tosend = cPickle.dumps (tosendlist)    tosendlen = str (len (enviar))    while len (tosendlen) <4:        tosendlen + implica ""   C .sendall (tosendlen) número de longitud de envío del cliente    c.sendall (tosend) # enviar voz exacta (volcar lista de reproducción) - cliente   ... algo diferente y toma mucho más de 0.05 segundos en NTB 

Aquí hay parte de este código deportivo "cliente" (el dispositivo plegable solo enviará / recibirá monedas):

  por 1:    tosendlist es igual a []    una vez len (flecha) == 0: número si casi siempre no hay flechas, solo agrega una enorme lista vacía        tosendlist.append ([])    otro:       Para enviar la lista .append (flechas)    tosendlist.append ([zeltankpos, 360-Winkel])    ob len (removelist) == 0: # si no se puede describir como ningún cambio en el mapa, simplemente se eliminará la lista adjunta        tosendlist.append ([])    otro:       Tosendlist .append (eliminar lista)        lista de retiro = []    tosend = cPickle.dumps (tosendlist)    tosendlen = str (len (enviar))    while len (tosendlen) <4:        tosendlen + es igual a ""    s.sendall (tosendlen) número enviar longitud al servidor    s.sendall (tosend) # enviar el mensaje perfecto por separado (volcar lista de reproducción) sin duda al servidor    inicio implica hora reloj ()    messagelen es igual a s.recv (4) # mismo intervalo que el siguiente mensaje (once caracteres fijos)   si "dentro de Messagelen:        Messagelen es un tiempo increíblemente similar para Messagelen.replace ("", "")    CPickle message = .loads (s.recv (int (messagelen))) # Lista de flechas, básicamente todas las demás posiciones del jugador y turnos en el mapa del juego    arrowmod implica mensaje [0]    Modtankposan significa punto [1]   Removelistmod = Mensaje [2]    para crear mi esposa y yo inRemovelistmod:        Tratar:             eliminar aumentos (i)        excepto ValueError:            eliminar randoss. (Yo soy)    Detalles de Time.clock () - inicio    ... competencia por una mini netbook innecesaria <0,17 seg. 

winsock recv slow

Por ejemplo, si sigo las instrucciones, puedes competir con una versión para un solo jugador del juego en un dispositivo (sin módulo de salida) en algunos dispositivos i5. Tiene 50 fps en la esquina izquierda más fina del mapa, además, 25 fps en cada esquina inferior precisa (un gráfico de calles de 1000x1000 píxeles contiene cuadrados de 5x5 píxeles, creo que es más lento principalmente debido a las grandes coordenadas, pero yo No puedo creer que sea muy fuerte Por cierto, Recv funcionó como el juego de LAN correcto durante un largo período de tiempo en el contexto de la esquina inferior derecha de nuestro mapa, el tipo de tiempo en particular dura casi lo mismo)tiene 4-8 FPS en un netbook Atom.

winsock recv slow

¿Podrías decirnos personalmente por qué es tan lento? Los programas no están sincronizados, algunos son incluso más rápidos, el otro de hecho es más lento, pero eso no se puede presumir, la latencia máxima será un poco más de 0.17 segundos, ¿verdad? ¿Y por no decir el hecho de que las llamadas a largo plazo pueden muy bien ocurrir solo en la computadora rápida?Además, no estoy del todo seguro de cómo funcionan esas funciones de envío / recepción. Es extraño que el gran sendall, literalmente, no lleve tiempo, o se necesiten 0,5 segundos para recuperarlo. Puede enviar todopruebas para enviar por correo electrónico el actual al archivo mientras el resto de la tienda sigue adelante.