Opóźnienie w przesyłaniu danych przez socket (klasy TcpListener i TcpClient)

0

Cześć!
właśnie piszę grę (snake) w C# typu multiplayer (na dwóch graczy). Serwer to aplikacja konsolowa, a klient to aplikacja WPF (gra).
Do komunikacji używam klas TcpListener i TcpClient.
Do serwera wysyłam wszystkie potrzebne dane w postaci łańcuchów znaków (string). Przede wszystkim są to różniej długości zmienne typu string, zawierające współrzędne węża (wąż skała się z kwadracików, obiekty Rectangle, do których dodatkowo załadowuję odpowiednią teksturę (zdjęcie)), więc te długości zmieniają się dynamicznie, w zależności od tego jak długi w danym momencie jest snake. Poza tym wysyłam informacje o kolizji ze ścianami, o tym, że gracz zjadł owoc itd. Odpowiednie dane, np. współrzędne oddzielone są od siebie separatorami, a rodzaj wiadomości rozpoznaje po pierwszym znaku otrzymanego łańcucha. Serwer np. otrzymuje wiadomość ze współrzędnymi i odsyła ją do drugiego gracza, drugi gracz to odbiera, odpowiednio splituje po separatorach i na bieżąco rysuje u siebie na planszy snake'a przeciwnika (plansza to Canvas w WPF). Podobnie z owocami, jeśli któryś z grczy zje owoc, to wysyła odpowiedni komunikat do serwera, serwer to odbiera, losuje nowe współrzędne dla owocu i odsyła do obu graczy aby mogli zaktualizować owoc na swoich planszach. No i generalnie wszystko działa ok, ale są dość duże (zauważalne) opóźnienia w przesyłaniu tych danych, czym dłużej się gra, a więc czym węże są dłuższe tym większe są te opoźnienia. Po jakichś 30 sekundach grania, lub minucie, te opóźnienia są rzędu 2 sekund. Widać to wyraźnie np. przy aktualizacji owoców. Gracz zjada owoc i dopiero po jakichś 2-3 sekundach na planszy pojawia się nowy owoc, a ten zjedzony zostaje wymazany. Podobnie z poruszaniem się węży, jak jest dwóch graczy, to dany gracz widzi swojego przeciwnika z takim właśnie opóźnieniem, czyli jak ten przecinik uderzy np. w ściankę planszy, to dany gracz widzi to dopiero po upływie pewnego czasu (1-2 s lub więcej).
Początkowo myślałem, że może WPF nie jest tutaj zbyt optymalnym rozwiązaniem i po prostu to rysowanie trwa długo, ale pomierzyłem trochę czasy z użyciem Stopwatch i z tych pomiarów wynika, że problem jest przy przesyłaniu danych, klienci otrzymują dane od serwera właśnie z lekkim opóźnieniem ... Czy to jest normalne? Jeśli tak, to jak sobie z tym poradzić, a jeśli nie, to co może być tego przyczyną?
Przyznaję, że jest to mój pierwszy projekt w WPF i ogólnie pierwszy z wykorzystaniem gniazd i w pierwszej kolejności chciałbym jakoś zmniejszyć lub całkowicie zniwelować te opóźnienia, następnym razem pisząc jakąś grę wykorzystam coś co bardziej się do tego nadaje, np. Unity, ale teraz chciałbym już dokończyć to co mam.
Z góry dziękuję za pomoc :)

0

Jest to jak najbardziej normalne, komunikacja po sieci zajmuję trochę czasu, najprostsze rozwiązanie to zminimalizować ilość przesyłanych danych, a później jest pod górkę, zaczyna się oszukiwanie gracza, próby przewidywania przyszłości, tutaj można sobie fajną historię poczytać jak trudno jest właśnie z lagami sobie poradzić:
A story about how I tried to get into game development and failed
A story about how I tried to get into game development and failed, Part 2
A story about how I tried to get into game development and failed, part 3

0

Nie znam się na grach, ale próbowałeś np. użyć protokołu UDP zamiast TCP ? Jest szybszy.

0
error91 napisał(a):

Nie znam się na grach, ale próbowałeś np. użyć protokołu UDP zamiast TCP ? Jest szybszy.

ta jest taki sam.. :)

0

jedynie udp wysyła i nie sprawdza czy dotarły dane, tcp sprawdza czy dotarły i ewentualnie wysyła jesczee raz

1 użytkowników online, w tym zalogowanych: 0, gości: 1