2010-01-16 22 views
5

W tym semestrze na uniwersytecie musimy napisać gry sieciowe (w języku Java) w zespołach 4-osobowych. Zgłosiłem się na ochotnika do pracy nad kodem sieci dla mojego zespołu.Różnica między DatagramSocket i DatagramChannel

czytania na java sieci, wydaje się, istnieją dwie metody UDP sieci:

http://java.sun.com/j2se/1.4.2/docs/api/java/net/DatagramSocket.html Jest to standardowy patrząc gniazdo UDP, które mogą wysyłać pakiety do dowolnego adresu IP dowolnego portu.

http://java.sun.com/j2se/1.4.2/docs/api/java/nio/channels/DatagramChannel.html Jest to rodzaj systemu kanałów, zbudowany na górze gniazda udp. Nie jestem do końca pewien, co oferuje, z wyjątkiem możliwości łączenia się tylko z jednym klientem, co nie jest zbyt przydatne w tym przypadku.

Czy są to jedyne opcje? Który jest najlepszy do wykorzystania w grze multiplayer w czasie rzeczywistym z 4-8 graczami?

+0

Chcę poznać rzeczywistą odpowiedź na pytanie ... ktoś pomaga? – Amos

Odpowiedz

5

Nie pytasz najpierw o pierwsze pytanie. Pierwsze pytanie brzmi: jaka dyscyplina komunikacyjna jest najbardziej odpowiednia dla tej gry?

Dla niewielkiej liczby użytkowników UDP stanowi więcej problemów niż jest to warte. Musisz martwić się o utracone pakiety, musisz wymyślić jakiś sposób na spakowanie danych w małe pakiety, yada, yada, yada.

W skali od 4 do 8 graczy można łączyć się z usługami sieciowymi i wysyłać wiadomość z mydłem. To zajmuje się serializacją danych dla ciebie. Heck, możesz nawet użyć JMS.

Jeśli chodzi o Twoje dosłowne pytanie, kanały są częścią nio. Obsługują multipleksowane-czekaj, których gniazda nie obsługują. Jeśli chcesz zapytać "czy jest jakiś pakiet dla mnie na którymś z tych portów?" chcesz kanałów. Bez nich potrzebujesz wątku na port. Zakładając oczywiście, że masz więcej niż jeden port, na którym odbierasz dane.

+1

Gra działa w czasie rzeczywistym, nie sądzę, że usługi sieciowe naprawdę by nadawały się do tego? – Martin

+1

SOAP to protokół synchroniczny, w którym są blokowane bloki wiadomości SOAP czekające na odpowiedź), więc gra w czasie rzeczywistym może być problematyczna w środowisku sieci o dużym opóźnieniu. –

+0

To ćwiczenia szkolne na małą skalę. – bmargulies

1

Czy Twój projekt obejmuje serwer centralny czy jest to klient-klient? To może wpłynąć na to, która technika jest odpowiednia dla komunikatorów.

Czy dozwolone jest korzystanie z bibliotek innych firm? Jeśli tak, zawsze uważałem, że JGroups jest bardzo dobry do robienia niezawodnego multiemisji. Jest łatwy do opanowania i wysoce konfigurowalny. (Niezależnie od tego, czy jest to odpowiednia pod względem wydajności gra w czasie rzeczywistym, nie jestem pewien, ale używałem jej w przeszłości do przesyłania dużej ilości danych i nigdy nie miałem problemów z wydajnością.)

+0

Nie jestem pewien, jakiego rodzaju bibliotek możemy używać. Muszę zapytać mojego doradcę, ale jeśli mamy pozwolenie, wygląda jak świetna biblioteka. – Martin

1

Gra działa w czasie rzeczywistym, nie sądzę, że usługi sieciowe naprawdę by nadawały się do tego?

Być może, ale do gier w czasie rzeczywistym jest problematyczne, bez względu na to, co w oparciu o internet wykorzystanie technologii:

  • Jeśli chcesz wesprzeć graczy po drugiej stronie planety, będzie miał do czynienia z siecią opóźnienia rzędu 1/2 sekundy lub więcej.

  • Jeśli chcesz wesprzeć zawodników w następnym hrabstwie, będziesz musiał zająć się sporadyczne „zamraża” spowodowane stratami pakietów wynikających z przeciążenia sieci, itp

  • Jeśli chcesz obsługiwać duże liczba graczy, wtedy musisz radzić sobie ze skalowaniem, zarówno z wykorzystaniem lokalnych zasobów, jak iz przepustowością sieci.

Tak więc, chociaż wybór transportu sieciowego jest ważny, jest to tylko jedna z części problemu. Prawdopodobnie ważniejsze jest zaprojektowanie protokołów poziomu aplikacji (gry), aby zminimalizować wpływ opóźnień sieciowych i zamrażanie/utratę pakietów na "doświadczeniu gracza". Lub po prostu ogranicz grę do korzystania z sieci LAN.