Piszę grę sieciową na iOS. Kiedy wysyłam pakiety z GKMatchSendDataReliable
(który, jak zakładałem, to UDP z zapisanym własnym kodem odbioru pakietów) z prędkością 60 pakietów na sekundę (czyli 16 ms między sąsiednimi pakietami), średni czas pingowania gwałtownie się pogarsza: otworzyłem 7 meczów GameCenter poniżej (jeden po drugim) ) i po prostu wysłał „powódź” 100 pakietów (w tempie 60 pakietów na sekundę). Zmierzyłem średni czas podróży w obie strony, a oto wyniki:
[ 21:16:39 ]: I saw an average roundtrip time of 52.342787 ms, he saw 54.496590 ms
[ 21:16:34 ]: I saw an average roundtrip time of 62.631942 ms, he saw 61.991655 ms
[ 21:16:45 ]: I saw an average roundtrip time of 88.394380 ms, he saw 83.619123 ms
[ 21:16:51 ]: I saw an average roundtrip time of 179.053118 ms, he saw 156.869141 ms
[ 21:16:57 ]: I saw an average roundtrip time of 75.025076 ms, he saw 75.419723 ms
[ 21:17:23 ]: I saw an average roundtrip time of 8832.082488 ms, he saw 7616.877558 ms
[ 21:19:33 ]: I saw an average roundtrip time of 25088.962344 ms, he saw 16833.064914 ms
Po ostatnich 2 testach wyniki wynoszą około 1000 ms.
Wydawałoby się, że jestem dławiony, najprawdopodobniej przez mojego dostawcę usług internetowych. Ponieważ jest to gra na iOS, ludzie będą korzystać ze zwykłych połączeń domowych.
Kiedy zmieniłem szybkość wysyłania pakietów na 10-krotnie wolniejszą (czyli 1 pakiet co 160 ms), testy trwają znacznie dłużej, ale czasy rundy są niezmiennie niskie.
[21:31:27]: Widziałem średni czas w obie strony 55.289109 ms, widział 69.032727 ms
Wygląda więc na to, aby utrzymać małe opóźnienie połączenia (i nie zostać „ukaranym” przez ISP). Muszę zmniejszyć szybkość wysyłanych pakietów. Pamiętaj, że są to bardzo małe pakiety, na przykład maksymalnie 40 bajtów, ale wciąż jestem dławiony.
Szukam wskazówek, ile pakietów UDP mogę wysłać na sekundę, aby uniknąć ograniczenia przepustowości! Czy są jakieś ogólne wytyczne?
źródło
Odpowiedzi:
Nawet domowe gry akcji lub duże gry MMO nie działają z częstotliwością 60 Hz. Ponadto posiadanie naprawdę małych rozmiarów pakietów niekoniecznie jest świetną rzeczą, każdy z tych małych pakietów ma duży narzut po prostu wysyłając je.
Spróbuj strzelać do aktualizacji 10 Hz z interpolacją po stronie klienta. Zakładam, że interpolujesz już, ponieważ zawsze pojawią się opóźnienia ping.
Przeczytaj o rozmiarach MTU i wrzuć tam więcej informacji, aby objąć dłuższe ramy czasowe. Średni rozmiar pakietu w warstwie transportowej wyniesie około 1400, wszystko powyżej rozmiaru MTU podzieli Twoją wiadomość i spowoduje jeszcze większe obciążenie.
źródło
Najpierw musisz się upewnić, jak duże są wszystkie dane. Twój dostawca usług internetowych najprawdopodobniej będzie dbał o liczbę wysłanych bajtów, a nie o liczbę lub częstotliwość datagramów. Jeśli wysyłasz datagramy o maksymalnej wielkości (65507 oktetów ładunku) 60 razy na sekundę, wysyłasz około 30 Mb / s w górę. Nie każdy ma takie połączenie.
Pamiętaj, że nagłówek IP ma długość 20 oktetów, a nagłówek UDP ma długość 8 oktetów. To dodatkowe 28 oktetów, które wysyłasz dla każdego datagramu.
Jeśli nie maksymalizujesz połączenia, istnieje wiele miejsc, w których twoje pakiety mogą się opóźniać: mianowicie system operacyjny klienta, twoja brama (prawdopodobnie router bezprzewodowy lub modem kablowy), twój dostawca usług internetowych, dostawca usług internetowych drugiego użytkownika, inny serwer równorzędny gateway, między innymi system operacyjny drugiego użytkownika.
Jeśli jeszcze go nie używałeś , zalecamy skorzystanie z Wireshark , który jest niezwykle potężnym narzędziem do diagnozowania problemów z siecią. Pomyśl o tym jak o odpowiedniku debuggera, ale do pracy w sieci.
Istnieje kilka sposobów diagnozowania ruchu sieciowego za pomocą Wireshark:
Używaj Wireshark na komputerze w tej samej sieci co urządzenie mobilne, z rozwiązanym hubem i ustawiając swoje urządzenie sieciowe jako rozwiązane
Ustaw komputer jako bramę bezprzewodową i podłącz urządzenie mobilne do tej bramy, a następnie słuchaj za pomocą Wireshark na tym komputerze
Uruchom Wireshark na tym samym komputerze co emulator
Uruchom tcpdump na samym urządzeniu (łatwe w Androidzie, wymaga jailbreak na iOS), a następnie przeczytaj przechwycone dane w Wireshark
Stwórz prosty program, który robi dokładnie to samo, ale działa na komputerze i użyj Wireshark.
... i wiele innych
Chcesz sprawdzić, które paczki są wysyłane i kiedy. Na przykład, jeśli opóźnienie wystąpi zanim zostaną wysłane, system operacyjny będzie dławiony; podczas gdy opóźnienie występuje nawet w wersji komputerowej tego samego programu, oznacza to, że gdzieś dławi cię sieć.
Zwykle, jeśli dławisz się przez sieć, powinieneś dostać datagramy ICMP typu 4, abyś mógł użyć ich do sprawdzenia, gdzie dokładnie dławisz się.
Podsumowując, istnieje wiele powodów, dla których twoje pakiety mogą się opóźniać, i dobrze byłoby dowiedzieć się, gdzie jest problem, zanim zaczniesz próbować go rozwiązać.
źródło
Wygląda na to, że jedno z moich założeń było błędne. Zgodnie z tym :
Zmiana trybu wysyłania na rzeczywisty UDP (tj.
GKMatchSendDataUnreliable
) Wydaje się utrzymywać niskie prędkości ping przy 60 pakietach na sekundę. Wygląda na to, że po raz kolejny uderzyły mnie Nagles .Nadal mam dziwne zachowanie (okresy z bardzo wysokimi czasami pingowania), ale nie jestem pewien głównej przyczyny (ISP lub przeciążenie sieci).
Później:
Jest to więc sporadyczne i faluje. Chyba będę musiał wypróbować niektóre sugestie z innych postów, takie jak zmniejszenie szybkości wysyłania pakietów.
źródło