Możesz natknąć się na kod błędu wskazujący, że winsock recv jest powolny. Istnieje wiele sposobów rozwiązania tego problemu, również wkrótce zajmiemy się tą stroną.

 

 

Witam Jestem nowy w Pythonie. Jestem prostą grą kasynową LAN (niełatwą dla mnie) z głównym modułem pygame.

Oto wyzwanie – mam dwa komputery stacjonarne (jeden netbook Intel Atom, drugi Apple i5 NTB). Chcę uratować co najmniej 5 klatek na sekundę (netbook spowalnia NTB, szczerze mówiąc nie aż tak bardzo, mam gotowy do 1,5 klatki na sekundę), szczerze mówiąc nazywam recv() wzrostem – część głównej pętli może zająć od 0 do 5 sekundy. każdy zegarek GPS. Mamy silną transmisję Wi-Fi, router ma prędkość w granicach 300 Mb/s, a ten gość wybija krótką wiadomość o długości około sześciuset znaków. Jak widać, rodziny używają i time.clock ().

dzięki czemu można mierzyć czas

Oto cały kod „po stronie serwera”, który zwykle napotykam w NTB i5:

  przeznaczony dla 1:    start zazwyczaj jest równy time.clock ()    messagelen implikuje c.recv (4) numer długość następnej wiadomości testowej głosowej (stałe 4 znaki)   obecny w "" Messagelen:        Messagelen oznacza Messagelen.replace ("", "")    point CPickle = .loads (c.recv (int (messagelen))) number Lista większości strzałek, pozycja razem z innymi graczami i ewolucja na określonej mapie gry    arrowmod oznacza wiadomość [0]    modtankposan = wiadomość [1]   Removelistmod = Wiadomość [2]    dla mnie w Removelistmod:        Próbować:             usuń wędrówki (i)        poza ValueError:            usuń Randoss. (Ja jestem)    drukuj czas.zegar () - start    tosendlist oznacza []    Załóżmy, że len (strzałki) == 0: # jeśli zwykle nie ma strzałek, zwykle dodawana jest potężna pusta lista        tosendlist.append ([])    inne:       Tosendlist .append (strzałki)    tosendlist.append ([zeltankpos, 360-Winkel])    może len (removelist) == 0: # faktyczne zdarzenie, w którym nie ma przycisków na tej mapie, bardzo często dodawana jest pusta lista        tosendlist.append ([])    inne:       Tosendlist .append (usuń listę)        lista tłumienia = []    tosend = cPickle.dumps (tosendlist)    tosendlen jest równe str (len (wysyłanie))    ale len (tosendlen) <4:        tosendlen + równa się „”   C .sendall (tosendlen) # długość wysyłania klienta    c.sendall (tosend) # prześlij dokładną wiadomość (zrzut listy odtwarzania) do klienta   ... coś innego zajmuje mniej niż 0,05 sekundy wokół NTB 

Oto część związana z kodem sportowym „klienta” (tylko flip gps – wysyłanie / uzyskiwanie monet):

  dla 1:    tosendlist = []    if ever len (strzałka) == 0: # jeśli jest gwarancja, że ​​zawsze nie ma strzałek, to po prostu może dostarczyć szalenie pustą listę        tosendlist.append ([])    inne:       Tosendlist .append (strzałki)    tosendlist.append ([zeltankpos, 360-Winkel])    len lekarza (removelist) == 0: # jeśli okaże się, że nie ma zmian w typie mapy, prawdopodobnie usunięta zostanie tylko załączona lista        tosendlist.append ([])    inne:       Tosendlist .append (usuń listę)        lista tłumienia równa się []    tosend= cPickle.dumps (tosendlist)    tosendlen jest równe str (len (wysyłanie))    pomimo faktu, że len (tosendlen) <4:        tosendlen + jest równe „”    s.sendall (tosendlen) # długość wysyłania odnośnie serwera    s.sendall (tosend) numer wyślij osobną wiadomość (zrzut listy odtwarzania) na serwer    start = godzina.zegar ()    messagelen = s.recv (4) liczba taka sama jak w dalszej korespondencji (stałe 8 znaków)   gdzie „wewnątrz w Messagelen:        Messagelen jest z pewnością podobny do Messagelen.replace ("", "")    Wiadomość CPickle = .massive (s.recv (int (messagelen))) # Lista powiązana ze strzałkami, prawie wszystkimi innymi statusami graczy i zmianami na mapie sportowej    arrowmod implikuje korespondencję [0]    Komunikat o zasobach Modtankposana [1]   Removelistmod to Wiadomość [2]    aby utworzyć i wRemovelistmod:        Próbować:             wytrzeć wędrówki (i)        z wyjątkiem ValueError:            złagodzić losowość. (Ja jestem)    Time.clock () szczegóły - start    ... konkurencja o dobry, zbędny netbook <0,17 s 

winsock recv slow

Na przykład, jeśli postąpię zgodnie z instrukcjami, możemy uruchomić grę dla jednego gracza na jednym systemie (bez modułu gniazd) na określonej liczbie urządzeń i5. Ma 50 fps w lewym górnym rogu mapy i 25 fps w każdym prawym dolnym rogu (mapa możliwości 1000×1000 pikseli zawiera kwadraty o wymiarach 5×5 pikseli, naprawdę uważam, że są wolniejsze ze względu na duże harmonie, ale Nie mogę uwierzyć, że jest naprawdę dość mocna Nawiasem mówiąc, Recv jako gra LAN przez długi czas w kontekście związanym z prawym dolnym rogiem wszystkich tych map, ten konkretny czas trwa tak samo)ma 4-8 FPS znalezionych na netbooku Atom.

winsock recv slow

Czy możesz nam tylko powiedzieć, dlaczego jest to tylko wolne? Programy są połączone z synchronizacją, jeden jest jeszcze szybszy, drugi wolniej, ale tego nie można się spodziewać, maksymalne opóźnienie może wynosić 0,17 sekundy, prawda? A nie mówiąc już o tym, że długoterminowe rozmowy będą odbywać się tylko na najszybszym komputerze?Ponadto nie jestem całkowicie przychylny, jak działa twoja operacja wysyłania / odbierania. Dziwne jest to, że zazwyczaj główny sendall dosłownie nie strzela w czasie, a znalezienie go zajmuje zaledwie 0,5 sekundy. Może upuścić wszystkotesty, aby wysłać bieżący, aby ostatecznie przejść do tła, podczas gdy reszta podłączona do dostawcy idzie dalej.