Podstawy gry online dla wielu graczy [zamknięte]

9

Obecnie pracuję nad ac # online multiplayer w czasie rzeczywistym. Celem jest połączenie klienta z serwerem za pomocą protokołu UDP. Do tej pory używałem UDP do ruchów graczy i TCP do wydarzeń (strzelanie do gracza, gracz tracący życie), ponieważ muszę mieć pewność, że takie dane dotrą do wszystkich graczy podłączonych do serwera. Wiem, że UDP jest określane jako „niewiarygodne” i niektóre pakiety mogą zostać utracone. Ale wszędzie czytałem, aby nigdy nie mieszać TCP i UDP, ponieważ może to wpłynąć na połączenie.

Główne pytanie brzmi: jak mam zorganizować sieć?

UDP jest bezpołączeniowy, jak mam oszczędzać, kto jest kim? Czy powinienem zapisać adresy IP klientów na liście?

Czy powinienem używać TCP do ważnych wydarzeń, czy używać UDP? Jeśli muszę korzystać z UDP, jak mogę się upewnić, że dane nie zostaną utracone?

Korzystając zarówno z protokołu TCP, jak i UDP, muszę zapisać dla każdego gracza ich adres IP na liście (dla UDP) i TcpClient, który jest połączony z inną listą (dla UDP). Jak mogę to zmienić, aby było bardziej skuteczne?

Lowip
źródło
@JoshPetrie to pytanie jest uzasadnione „Główne pytanie brzmi: jak mam zorganizować sieć?”. Nie chodzi o to, czy powinienem użyć tego czy tamtego. OP używa jednego i potrzebuje porady na temat dodania innej technologii, którą już wybrał. Jest szeroki, ponieważ odpowiedź nie dotyczy tego, w której technologii należy zastosować, ale w tym, w jaki sposób oprogramowanie może być skonstruowane, aby uniknąć wzdęć, zmniejszyć opóźnienie i zwiększyć niezawodność niezależnie od podstawowej technologii.
Coyote
Jest też zbyt szeroki. Pytanie powinno zostać zredagowane (możesz to zrobić, jest dość stare), aby być bardziej tematycznym, a następnie można je ponownie otworzyć.

Odpowiedzi:

6

UDP ma mniejszy narzut, ale kosztem utraty pakietów bez wiedzy o tym (część narzutu z TCP zapewnia, że ​​utracone pakiety zostaną ponownie wysłane).

Jednak dużym problemem związanym z używaniem UDP jest to, że istnieje wiele witryn, które blokują cały ruch UDP (z wyjątkiem DNS), ponieważ wielu administratorów uważa, że ​​jest to dobra praktyka bezpieczeństwa.

Nie zakładaj też, że każdy z twoich graczy będzie miał inny adres IP - istnieje wiele sytuacji, w których wielu użytkowników korzysta z tego samego połączenia internetowego, a jeśli dzieci w szkole uzależnią się od Twojej gry, możesz się założyć, że prawdopodobnie zastanowię się, jak zainstalować i uruchomić go podczas zajęć zamiast wykonywać swoją pracę (i czy nie wolałbyś, aby spędzali ten cenny czas na grze zamiast na cudzym?).

Po otwarciu strumienia TCP nadal jest dość wydajny. Następnym krokiem jest zminimalizowanie ilości wysyłanych / odbieranych danych, i tu właśnie zaczyna się projektowanie protokołu. Jeśli po prostu wyślesz kilka bajtów dla każdego polecenia (np. „Przejdź do przodu”) zamiast, na przykład, zawijasz to samo polecenie w setki bajtów kodu XML, wówczas ogólne zużycie przepustowości sieci będzie niższe ORAZ mniej cykli procesora być wymagane do przetworzenia informacji (kilka bajtów można łatwo porównać z demontażem, interpretacją i sprawdzaniem składni dużej części XML).

Z pewnością możesz otworzyć wiele strumieni TCP i używać ich do różnych celów, takich jak jeden do poleceń, inny do przesyłania grafiki, inny do czatu audio itp. W ten sposób, jeśli przesyłasz dużą grafikę, która zajmuje 5-10 sekund na pobranie, przynajmniej ruchy poleceń gracza nie pozostaną w tyle, ponieważ będą one w innym strumieniu (i możesz wyświetlać domyślnego duszka aż do zakończenia pobierania nowego duszka, co zawsze jest przyjemniejsze niż czekanie).

Randolf Richardson
źródło
1
Pierwotne pytanie dotyczyło modelu klient-serwer, więc „witryny” blokujące wszystkie UDP są nieistotne; taki jest problem klienta i wątpię, aby wielu klientów faktycznie blokowało wszystkie UDP. „Korzystanie z protokołu TCP jest najgorszym możliwym błędem, jaki możesz popełnić, projektując grę sieciową! Aby zrozumieć, dlaczego, musisz zobaczyć, co tak naprawdę robi protokół TCP ponad IP, aby wszystko wyglądało tak prosto!” Zobacz gafferongames.com/networking-for-game-programmers/udp-vs-tcp
faktycznie 005
@ rzeczywiście 005: Są wady i zalety - UDP zdecydowanie zapewnia przewagę wydajności, ale kosztem niezawodności (czyli tam, gdzie przewagę ma TCP). Jeśli chodzi o blokowanie UDP, masz całkowitą rację, że jest to problem klienta, ale w wielu środowiskach korporacyjnych i edukacyjnych napotkałem, że UDP (z wyjątkiem portu 53) jest blokowany przez nieświadomych administratorów, którzy uważają, że UDP stanowi problem bezpieczeństwa, i więc opcja powrotu do TCP przez klienta może co najmniej oznaczać, że gracz może doświadczyć gry (szczególnie jeśli przepustowość sieci jest wystarczająco szybka).
Randolf Richardson,
@ faktycznie 005: Również użycie kombinacji UDP i TCP może być całkiem akceptowalne, ponieważ TCP może być używany do przesyłania danych o niższym priorytecie, podczas gdy UDP może być wykorzystywany do szybkich działań. Warto również zauważyć, że w przypadku IPv6 dostępne są nowe opcje (które nie są dostępne w IPv4), które mogą zaspokoić potrzeby gier w czasie rzeczywistym, ale nie mają charakteru bezpołączeniowego, ale myślę, że minie trochę czasu przed IPv6 mogą być wykorzystywane przez gry bez konieczności polegania na IPv4 (jest to niefortunne, więc radzimy sobie z IPv4 najlepiej, jak na razie).
Randolf Richardson,