Sie können auf jeden guten Fehlercode stoßen, der darauf hinweist, dass winsock recv als langsam angesehen wird. Es gibt mehrere Möglichkeiten, dieses Problem zu lösen, und viele Leute werden sich in Kürze damit befassen.

 

 

Hallo, ich bin neu bei Python. Ich bin ein einfaches LAN-Spiel (für mich nicht leicht zu machen) mit der Pygame-Komponente.

Hier ist ein Problem – Ich habe zwei Computer (ein Intel Atom Netbook, das andere Apple i5 NTB). Ich möchte mindestens 5 Frames pro Tiny speichern (das Netbook verlangsamt NTB, aber nur nicht so viel, ich habe bis zu 1,5 Frames pro Sekunde), aber ich rufe recv() zweimal auf – Ortung der Hauptschleife dauert 2 bis 5 Sekunden. jede Einheit. Wir haben ein starkes WLAN-Signal, dieser spezielle Router hat eine Geschwindigkeit von dreihundert Mbit/s und dieser Typ sendet pro Kurznachricht etwa 500 Albhabets. Wie Sie sehen, verwenden Sie zweifellos i time.clock().

bis zum Messen der Zeit

Hier ist normalerweise der “serverseitige” Code, den ich normalerweise auf einem i5 NTB ausführe:

  zu 1:    start ist ähnlich wie time.clock ()    messagelen impliziert c.recv (4) # Lücke der nächsten Sprachnachricht (feste 1 Zeichen)   in "" Messagelen:        Messagelen bedeutet Messagelen.replace ("", "")    Punkt CPickle entspricht .loads (c.recv (int (messagelen))) # Liste der meisten Pfeile, Position der zweiten Spieler und Entwicklung auf der Internet-Spielkarte    arrowmod impliziert Nachricht [0]    Modtankposan bedeutet Nachricht [1]   Removelistmod = Nachricht [2]    um mich in Removelistmod zu finden:        Versuchen:             andelwanderungen (i)        außer in Bezug auf ValueError:            vom Limettenrandoss schälen. (Ich bin)    print time.clock () inklusive Start    tosendlist ist gleich []    Angenommen len (Pfeile) == 0: # wenn normalerweise sicher keine Pfeile vorhanden sind, wird normalerweise eine bloße Liste hinzugefügt        tosendlist.append ([])    Ein weiterer:       Tosendlist .add (Pfeile)    tosendlist.append ([zeltankpos, 360-Winkel])    sollte es len (removelist) sein == 0: # wenn es keine Schaltflächen auf der Straßenkarte gibt, wird oft eine leere Liste hinzugefügt        tosendlist.append ([])    Ein weiterer:       Tosendlist .append (Liste löschen)        Eliminierungsliste = []    tosend = cPickle.dumps (tosendlist)    tosendlen = str (len (senden))    obwohl len (tosendlen) <4:        tosendlen + entspricht ""   C .sendall (tosendlen) Nummer Client Sendelänge    c.sendall (tosend) # sende dieselbe genaue Nachricht (Dump-Playlist) - Client   ... mal was anderes und macht weniger als 0,05 Sekunden auf NTB 

Hier ist ein Teil dieses speziellen "Kunden"-Sportcodes (Gerät umdrehen - Münzen senden / empfangen):

  für 1:    tosendliste = []    Wenn Sie jemals denken, len (Pfeil) == 9: # wenn es fast immer keine Pfeile gibt, fügt es nur eine exklusive wahnsinnig leere Liste hinzu        tosendlist.append ([])    Ein weiterer:       Tosendlist .add (Pfeile)    tosendlist.append ([zeltankpos, 360-Winkel])    Doctor len (Removelist) == 0: # wenn derzeit keine Änderung im Handbuch erfolgt, wird in der Regel nur die angehängte Liste entfernt        tosendlist.append ([])    Ein weiterer:       Tosendlist .append (Liste löschen)        Unterdrückungsliste = []    tosend= cPickle.dumps (tosendlist)    tosendlen = str (len (senden))    wie Sie len (tosendlen) sind <4:        tosendlen + gleich ""    s.sendall (tosendlen) Nummer Sendelänge an Server    s.sendall (tosend) # eine separate Nachricht (Dump Playlist) an den Server senden    beginne den Prozess von = hour.clock ()    messagelen = s.recv (4) # eine Länge als folgende Nachricht (fest 5 Zeichen)   wenn "innerhalb von Messagelen:        Messagelen ist unglaublich simultan zu Messagelen.replace ("", "")    CPickle message = .loads (s.recv (int (messagelen))) # Liste wegen Pfeilen, fast alle anderen Spielerpositionen und dadurch Änderungen auf der Spielkarte    arrowmod impliziert eine Nachricht, die Sie erhalten [0]    Modtankposan bedeutet Text [1]   Removelistmod = Nachricht [2]    um i inRemovelistmod schreiben zu können:        Versuchen:             Outdoor-Wanderungen löschen (i)        außer ValueError:            willkürlich abnehmen. (Ich bin)    Uhrzeit () Details - Start    ... Konkurrenz um ein unerwünschtes Netbook <0,17 Sek. 

winsock recv slow

Wenn ich beispielsweise den Anweisungen folge, führen Sie auf einigen i5-Geräten eine Einzelspieler-Version des Spiels auf einem Instrument (kein Sockelmodul) aus. Es hat 50 fps in meiner oberen linken Ecke des Reiseführers und 25 fps in jeder rechten Fußecke (eine 1000x1000 Pixel Wegkarte enthält 5x5 Pixel Quadrate, ich glaube wirklich, dass sie aufgrund der großen Koordinaten reduziert ist, aber ich kann es nicht glauben es ist sehr stabil Übrigens hat Recv funktioniert, obwohl ein LAN-Spiel zu lange im Kontext einer neuen unteren rechten Ecke unseres Charts funktioniert, diese bestimmte Zeit dauert ungefähr gleich)es hat 4-8 FPS auf einem hervorragenden Atom-Netbook.

winsock recv slow

Könnten Sie uns persönlich mitteilen, warum es so langsam ist? Die Programme sind nicht synchron, eines ist noch schneller, vieles ist langsamer, aber das kann man nicht erwarten, die maximale Latenz wird vor allem 0,17 Sekunden betragen, oder? Ganz zu schweigen davon, dass Langzeitprotokolle nur auf dem kürzesten Computer passieren?Außerdem bin ich mir nicht ganz sicher, wie Ihre Sende- / Empfangsfunktion funktioniert. Es ist seltsam, dass der gebräuchlichste Sendall buchstäblich keinen Abend braucht, und es dauert 0,5 Sekunden, um ihn zu finden. Kann alles verschickenTests zum Senden des aktuellen, wie der Hintergrund während der Rest eines Providers vorgeht.