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?
źródło
Odpowiedzi:
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).
źródło
To nie jest bezpośrednia odpowiedź na twoje pytanie, ale gafferongames ma kilka naprawdę fajnych artykułów na temat gier sieciowych: http://gafferongames.com/networking-for-game-programmers/what-every-programmer-needs-to-know-about -game-networking /
źródło