Potresti imbatterti in un fantastico codice di errore che indica che winsock recv è senza dubbio lento. Esistono diversi processi per risolvere questo problema e me ne occuperò a breve.

 

 

Ciao, sono nuovo di Python. Mattina un semplice gioco in LAN (non efficace per me) con il componente pygame.

Ecco una difficoltà: ho due computer (un netbook Intel Atom, l’altro Apple i5 NTB). Voglio salvare almeno 5 fotogrammi al terzo (il netbook rallenta NTB, ma invece di così tanto, ho direttamente fino a 1,5 fotogrammi al secondo), ma chiamo recv () due volte – parte del ciclo principale richiede 4 a 5 secondi. ogni unità. Abbiamo un forte segnale wifi, la maggior parte del router ha una velocità di 600 Mbps e questo ragazzo invia un singolo messaggio breve di circa 500 lettere. Come puoi vedere, sei diventato usando i time.clock ().

per misurare positivamente il tempo

Ecco la maggior parte del codice “lato server” che di solito eseguo su un potente NTB i5:

  per conto di 1:    start è equivalente a time.clock()    messagelen implica c.recv (4) # tempo di percorrenza del prossimo messaggio vocale (4 caratteri fissi)   in "" Messaggio:        Messagelen significa Messagelen.replace ("", "")    point CPickle equivale a .loads (c.recv (int (messagelen))) # Elenco della maggior parte delle frecce, posizione di altri tipi di giocatori ed evoluzione sulla mappa del gioco del golf    arrowmod è uguale al messaggio [0]    modtankposan è uguale al messaggio [1]   Removelistmod = Messaggio [2]    di me in Removelistmod:        Provare:             cancellare le escursioni (i)        tranne adatto per ValueError:            eliminare il randos. (Sono)    stampa time.clock () o start    tosendlist significa []    Supponiamo che len (frecce) == 0: # se normalmente non ci sono frecce, di solito viene aggiunta una lista vuota        tosendlist.append ([])    un altro:       Tosendlist .add (frecce)    tosendlist.append ([zeltankpos, 360-Winkel])    fintanto che len (elenco di rimozione) == 0: # se di solito non ci sono pulsanti sulla mappa stradale, viene aggiunta principalmente una lista vuota        tosendlist.append ([])    un altro:       Tosendlist .append (elimina lista)        lista di riduzione = []    tosend = cPickle.dumps (tosendlist)    tosendlen = str (len (invio))    quando sei len (tosendlen) <4:        tosendlen + è uguale a ""   C .sendall (tosendlen) numero client invia lunghezza    c.sendall (tosend) # send true message (dump playlist) - client   ... qualcosa di diverso e potrebbe richiedere meno di 0,05 secondi su NTB 

Ecco una parte del codice sportivo “cliente” esatto (solo il dispositivo flip – invia / riceve monete):

  per 1:    lista di invio = []    se risulta mai len (freccia) == 9: # se non ci sono quasi sempre frecce, aggiunge solo una lista follemente vuota        tosendlist.append ([])    un altro:       Tosendlist .add (frecce)    tosendlist.append ([zeltankpos, 360-Winkel])    medico len (lista di rimozione) == 0: # se su quel punto non c'è nessun cambiamento nella strada, solo l'elenco allegato verrà sempre rimosso        tosendlist.append ([])    un altro:       Tosendlist .append (elimina lista)        lista di soppressione = []    tosend= cPickle.dumps (tosendlist)    tosendlen = str (len (invio))    in contrasto con len (tosendlen) <4:        tosendlen + equivale a ""    s.sendall (tosendlen) numero invia lunghezza al server    s.sendall (tosend) # fornisce un messaggio separato (dump playlist) al server    inizio = ora.orologio ()    messagelen = s.recv (4) # una lunghezza come il seguente messaggio (6 caratteri fissi)   se "dentro tramite Messagelen:        Messagelen è incredibilmente connesso a Messagelen.replace ("", "")    CPickle message = .loads (s.recv (int (messagelen))) # Elenco relativo alle frecce, quasi tutte le posizioni degli altri giocatori inoltre cambiano sulla mappa di gioco    arrowmod implica il testo [0]    Modtankposan significa credenza [1]   Removelistmod = Messaggio [2]    per ottenere i inRemovelistmod:        Provare:             eliminare le escursioni all'aperto (i)        ad eccezione di ValueError:            estrarre randos. (Sono)    Dettagli Time.clock () - inizio    ... competizione per un netbook non necessario <0.17 sec 

winsock recv slow

Ad esempio, ogni volta che seguo le istruzioni, potresti eseguire una versione per giocatore singolo collegata al gioco su un’unità (nessun modulo socket) su alcuni dispositivi i5. Ha 50 fps in una sorta di angolo in alto a sinistra della guida e 25 fps in ogni angolo più basso a destra (una mappa dell’autostrada 1000×1000 pixel contiene quadrati 5×5 pixel, penso davvero che sia lentamente a causa delle grandi coordinate, mentre posso non credo che sia molto efficace A proposito, Recv ha funzionato a lungo come un gioco LAN nel contesto del quale l’angolo in basso a destra della nostra strada, questo tempo particolare dura all’incirca lo stesso)ha 4-8 FPS su un fantastico netbook Atom.

winsock recv slow

Può assicurarci personalmente perché è così facile? I programmi non sono sincronizzati, uno è ancora più veloce, i molti sono più lenti, ma questo non può essere previsto, la latenza massima sarà di 0,17 secondi, giusto? E non per menzionare il fatto che le scelte a lungo termine avverranno solo sul computer più veloce?Inoltre, non sono del tutto sicuro di come funzioni la tua funzione di invio / ricezione. È strano che il sendall predominante letteralmente non richieda momenti e impiega 0,5 secondi per trovarlo. Può inviare tuttotest quando è necessario inviare quello corrente al tuo background mentre il resto senza dubbio il provider va avanti.