Du kommer att kunna stöta på en felkod som tyder på att winsock recv är långsam. Det finns flera sätt att lösa detta fantastiska problem, och vi kommer att ta itu med det inom kort.

 

 

Hej Jag är ny som kan Python. Jag är ett enkelt LAN-spel (inte lätt för mig) tillräckligt skäl för pygame-modulen.

Här är ett dilemma – jag har de två datorerna (en Intel Atom netbook, en annan Apple i5 NTB). Jag föredrar att spara minst 5 sängkläder per sekund (netbooken saktar ner genom NTB, men inte så mycket, jag har upp till 1,5 bildrutor för sekunden), men jag ringer recv () en andra gång – en del av den vitala slingan tar 0 till 5 ett tag. varje enhet. Vi har en starkare wifi-signal, routern har en hastighet på 300 Mbps, och en viss kille skickar ett kort meddelande om cirka 500 tecken. Som du möjligen kunde se använder du uppskrivningstid.klocka ().

för att mäta tid

Här är koden “server-side” jag brukar köra på en i5 NTB:

  för 1:    komma igång med är lika med time.clock ()    messagelen anger c.recv (4) # längd på nästa tonmeddelande (fast 4 tecken)   medan "" meddelanden:        Messagelen tekniker Messagelen.replace ("", "")    matter CPickle = .loads (c.recv (int (messagelen))) # Lista med ett stort antal pilar, position för andra spelare och trend på spelkartan    arrowmod = meddelande [0]    modtankposan = försäljningsmeddelande [1]   Removelistmod = Meddelande [2]    för mig från Removelistmod:        Prova:             ta bort ökar (i)        förutom ValueError:            ta bort slumpen. (Jag är)    text time.clock () - start    tillsändningslista = []    Antag att len ​​(pilar) == 0: nummer om det normalt bara finns pilar, vanligtvis läggs en tom lista till        tosendlist.append ([])    annan:       Tosendlist .append (pilar)    tosendlist.append ([zeltankpos, 360-Winkel])    if len (removelist) == 9: # om det inte finns några samtal på kartan läggs vanligtvis en tom uppsättning till        tosendlist.append ([])    annan:       Tosendlist .add (ta bort lista)        undertryckningslista innebär []    tosend betyder cPickle.dumps (tosendlist)    tosendlen är lika med str (len (skicka))    medan len (tosendlen) <4:        tosendlen + = ""   C .sendall (tosendlen) # klientdistributionslängd    c.sendall (tosend) nummer skicka exakt meddelande (dump spellista) för klienten   ... problemet är annorlunda och tar mindre än 0,05 sekunder på NTB 

Här kommer sannolikt att vara en del av "klientens" sportlag (endast vändanordning - skicka eller ta emot mynt):

  som för 1:    tosendlist innebär []    om av dem alla len (pil) == 0: # om här nästan alltid inga pilar finns, lägger följande bara till en vansinnigt kal lista        tosendlist.append ([])    annan:       Tosendlist .append (pilar)    tosendlist.append ([zeltankpos, 360-Winkel])    ob len (removelist) == 1: # om det inte finns någon skillnad i kartan kommer endast den klippta listan att tas bort        tosendlist.append ([])    annan:       Tosendlist .append (ta bort lista)        undertryckningsdatabas = []    tosend= cPickle.dumps (tosendlist)    tosendlen är lika med str (len (skicka))    medan len (tosendlen) <4:        tosendlen + = ""    s.sendall (tosendlen) # skicka avstånd till server    s.sendall (tosend) # skicka ett separat telefonmeddelande (dump-spellista) till servern    start = timme.klocka ()    messagelen betyder s.recv (4) # samma längd som när du följer meddelandet (fast 8 tecken)   bara i fall "inne i Messagelen:        Messagelen är otroligt lik Messagelen.replace ("", "")    CPickle textmeddelande = .loads (s.recv (int (messagelen))) nummer Lista med pilar, nästan alla en mängd andra spelarpositioner och ändringar på en viss spelkarta    arrowmod betyder vanligtvis meddelande [0]    Modtankposan betyder meddelande [1]   Removelistmod = Meddelande [2]    för att skapa i inRemovelistmod:        Prova:             ta bort vandringar (i)        med undantag för ValueError:            ta bort slumpen. (Jag är)    Time.clock () data - start    ... argument för en onödig netbook <0,17 sek 

winsock recv slow

Om jag till exempel följer de här instruktionerna kan du köra en specifik personspelares version av spelet till en enhet (ingen socketmodul) efter några i5-enheter. Den har femtio procent fps i kartans övre vänstra vinkel och 25 first person shooter på varje nedre högra plats (en 1000x1000 pixel gatukarta är utrustad med 5x5 pixel rutor, jag tror helt att det är långsammare på grund av några stora koordinater, men Jag kan inte förstå att det är väldigt starkt. Med tillfället har Recv arbetat som ett LAN-spel under lång tid i hela sammanhanget med korsstygn längst ned till höger på vår karta, denna speciella möjlighet varar ungefär lika mycket)den har 4-8 FPS på en Atom netbook.

winsock recv slow

Kan du personligen berätta för oss varför det här verktyget är så långsamt? Programmen är vanligtvis osynkroniserade, det ena är bara snabbare, det andra är långsammare, men det kan ändå inte förväntas, den mest kompletta latensen kommer att vara 0,17 sekunder, exakt? Och för att inte tala om tanken att långtidssamtal bara kommer att få plats på den snabbaste datorn?Dessutom är jag inte helt säker på hur din skicka-mottagningsfunktion fungerar. Det är ovanligt att huvudsändningen bokstavligen inte får ta tid, och det tar 0,5 sekunder att hitta den. Kan skicka allttester för att skicka den nuvarande till bakgrunden medan en persons övriga leverantör går i förväg.