Po przeczytaniu Czy UDP wciąż jest lepszy niż TCP w przypadku gier z dużą ilością danych? , Zastanawiam się, czy sensowne jest jednoczesne używanie zarówno TCP, jak i UDP, ale do różnych celów:
TCP do wysyłania informacji wysyłanych rzadko, ale należy zagwarantować, że dotrą one niezawodnie.
Na przykład aktualizacje wyników, imię gracza, a nawet stan włączenia / wyłączenia światła w świecie gry.UDP do przesyłania informacji, które są stale aktualizowane i mogą być czasami tracone, ponieważ nowsze informacje są zawsze w drodze.
Takie jak pozycja, obrót itp.
Czy to rozsądny pomysł? Jakie są możliwe wady?
Czy są lepsze sposoby na poradzenie sobie z tym?
networking
multiplayer
udp
gandalf3
źródło
źródło
Odpowiedzi:
Powoduje to utratę pakietów dla UDP z powodu sprzeczności między dwoma protokołami - pamiętaj, że UDP nie gwarantuje dostarczenia, podczas gdy TCP. Przejdzie więcej pakietów TCP, podczas gdy UDP cierpi - TCP powoduje utratę pakietów UDP . Pojawił się również (historyczny) pomysł, że infrastruktura routerów faworyzuje TCP zamiast UDP, choć wątpię, aby do tej pory tak było.
Myślę, że lepiej byłoby znaleźć jeden z protokołów UDP zorientowanych na połączenie, który jest dostępny do gier i tym podobnych, który oferuje niektóre zalety TCP bez żadnych jego wad. Jest kilka takich, zwykle z oficjalnym dokumentem opisującym każdą koncepcję.
Przykładem tego jest biblioteka Enet typu open source , której podstawową funkcją jest opcjonalne niezawodne dostarczanie pakietów w kolejności przez UDP.
źródło
Oto cytat Sama Jansena z komentarza na gafferongames.com :
Artykuł Charakterystyka utraty pakietów UDP: Wpływ ruchu TCP uzyskał swoje wyniki, otwierając wiele połączeń TCP jednocześnie i zalewając sieć danymi. Prowadzi to do przeciążenia, po którym następuje globalna synchronizacja , które powodują odrzucanie pakietów. Oczywiście klient gry nie otworzy jednocześnie kilkunastu połączeń i zalej sieć danymi, więc Twoje wyniki będą inne.
Odpowiedzieć na Twoje pytanie:
Tak, jest to do przyjęcia, zakładając, że nie przekraczasz limitów przepustowości.
Korzystając zarówno z protokołu TCP, jak i UDP, zawsze powinieneś preferować wysyłanie jak największej ilości danych przez UDP, a możliwie jak najmniej przez TCP.
Teraz pytam: czy naprawdę konieczne jest przesłanie partytury, nazwy gracza i stanu światła przez TCP? Chociaż prawdą jest, że w końcu musisz otrzymać te dane, czy to prawda, że musisz otrzymywać te dane ściśle w kolejności i dokładnie raz?
Prawdopodobnie nie.
UDP działa dobrze w tych przypadkach, a Quake 3 jest dobrym przykładem tego, jak to zrobić.
Więc jaki jest dobry przykład TCP obok UDP? Pomyśl o czacie gry. Aktualizacje tego czatu (to znaczy nowe wiersze tekstu) muszą być przesyłane zarówno niezawodnie, jak i ściśle w kolejności. Tak więc TCP jest dobrym dopasowaniem.
źródło
Czy to rozsądny pomysł?
Jakie są możliwe wady?
Czy są lepsze sposoby na poradzenie sobie z tym?
źródło
Należy wziąć pod uwagę dodatkowe ograniczenie zasobów. Większość wdrożeń (Wierzę wszystkim, ale nie ma odniesienia) TCP na serwerze ma ograniczenia dotyczące liczby jednoczesnych połączeń TCP, które serwer może otworzyć jednocześnie. Ograniczyłoby to liczbę graczy, których możesz otworzyć jednocześnie, jeśli każdy gracz potrzebuje własnego połączenia.
Limity są określone przez ustawienia w systemie sieciowym. Dodatkowo każde połączenie zużywa trochę pamięci, która musi pochodzić skądś na serwerze.
Jednym z rozwiązań jest otwarcie tymczasowego połączenia TCP podczas przesyłania danych i natychmiastowe zamknięcie. Spowoduje to spowolnienie transakcji, otwarcie połączenia TCP jest raczej „drogim” procesem. Jak zawsze, od samego początku chodzi o zaprojektowanie solidnego systemu, aby umożliwić duży rozwój.
źródło