Czy Websockety są odpowiednie do gier wieloosobowych w czasie rzeczywistym?

Jestem zainteresowany zbudowaniem małej gry multiplayer w czasie rzeczywistym, przy użyciu HTML5 / JavaScript dla klienta i prawdopodobnie Java dla oprogramowania serwerowego.

Przyjrzałem się trochę Websocketom, ale wygląda na to, że miałem błędne przekonania na temat tego, czym tak naprawdę są Websockety. Początkowo myślałem o WebSockets jako po prostu JavaScript sposób obsługi gniazd TCP, tak jak są one używane w Javie i innych językach, ale wygląda na to, że jest cały proces handshaking, który musi mieć miejsce, i każdy transmisja obejmuje wiele kosztów HTTP (i w tym przypadku korzyści z Ajax nie wydają się tak ekscytujące, jak na pierwszy rzut oka)?

Na pokrewny temat, czy są jakieś lepsze alternatywy dla WebSockets do tego celu (Gry multiplayer w czasie rzeczywistym w JavaScript)?

Author: Josh1billion, 2011-11-17

5 answers

WebSockets są najlepszym rozwiązaniem dla gier multiplayer w czasie rzeczywistym działających w przeglądarce internetowej. Jak wskazano w komentarzach, istnieje wstępny uścisk dłoni, w którym połączenie HTTP jest aktualizowane, ale po nawiązaniu połączenia WebSockets oferują mechanizm połączenia o najniższym opóźnieniu dla dwukierunkowej komunikacji między serwerem a klientem.

Polecam obejrzeć: https://www.youtube.com/watch?v=_t28OPQlZK4&feature=youtu.be

Zobacz at:

Jedynym surowym rozwiązaniem TCP byłoby użycie wtyczki obsługującej jakiś obiekt TCPClient. Polecam wypróbować WebSockets.

Możesz znaleźć wiele opcji tutaj . Po prostu wyszukaj WebSockets na stronie.

Zobacz też WebRTC . W zależności od celu Gry i tego, czy serwer jest potrzebny do zarządzania stanem gry, możesz użyć tej technologii do komunikacji peer-to-peer. Możesz nadal potrzebować rozwiązania, aby poradzić sobie z umieszczaniem graczy w grupach - w takim przypadku WebSockets jest najszybszym / najlepszym rozwiązaniem.

 33
Author: leggetter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-16 09:40:09

Gry Multiplayer wymagają od serwera wysyłania okresowych migawek stanu świata do klienta. W kontekście przeglądarki HTML / JS aplikacji masz niewiele do wyboru: ankiety, websocket lub napisać własną wtyczkę, Aby rozszerzyć możliwości przeglądarki.

Ankiety HTTP, takie jak BOSH lub Bayeux są wyrafinowane, ale wprowadzają obciążenie sieci i opóźnienia. Websocket został zaprojektowany, aby przezwyciężyć ich ograniczenia i jest zdecydowanie bardziej / align = "left" /

Biblioteki, takie jak cometd lub socket io , zapewniają abstrakcję transportu i rozwiązują problemy ze zgodnością przeglądarki. Co więcej, pozwala na przełączanie się między bazowymi transportami i porównywanie ich wydajności bez wysiłku.

I coded multiplayer arcade game with socket.io i zwykle mierz opóźnienie 2ms za pomocą websocket i około 30ms za pomocą XHR-polling w sieci lan. Wystarczy na multiplayer gry.

Proponuję zajrzeć do nodejs i socket.io aby móc udostępniać kod między Klientem a serwerem, można również wypożyczyć jakiś kod multiplayer na [3].

 7
Author: Pierre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-12 09:18:46

Nie jestem pewien, czy WebSockets są nadal najlepszym narzędziem do tworzenia sieci a real-time multiplayer these days (2017). WebRTC jest nowszą technologią który oferuje potencjał znacznie wyższej wydajności. I te dni, WebRTC jest również łatwiejsze do pracy dzięki następującym bibliotekom:

  • node-webrtc upraszcza tworzenie sieci po stronie serwera
  • webrtc-natywny , który zapewnia również bibliotekę po stronie serwera i może być szybszy jak nazwa sugeruje
  • electron-webrtc zapewnia implementację, która jest dobra, jeśli chcesz spakować grę za pomocą electron

Alternatywnie, jeśli chcesz oszczędzić sobie rzeczywistych szczegółów implementacji sieci, a szukasz biblioteki, która zapewnia interfejs multiplayer wyższego poziomu, spójrz na Lance.gg . (zastrzeżenie: jestem jednym z współtwórców).

 7
Author: Gary Weiss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-07 20:46:27

Zasadniczo w momencie pisania tego tekstu masz 3 opcje:

WebSockets

WebSockets to lekki protokół komunikacyjny, który wykorzystuje TCP, a nie implementację Javascript gniazd TCP, jak już zauważyłeś. Jednak poza początkowym uściskiem dłoni, nie ma nagłówków HTTP przekazywanych tam i z powrotem poza ten punkt. Po nawiązaniu połączenia dane przechodzą swobodnie, z minimalnym obciążeniem.

Long-polling

Long-ankietowanie, w nutshell, polega na tym, że klient okresowo wypytuje serwer o nowe informacje za pomocą żądań HTTP. Jest to niezwykle kosztowne pod względem CPU i przepustowości, ponieważ za każdym razem wysyłasz potężny nowy nagłówek HTTP. Jest to zasadniczo jedyna opcja, jeśli chodzi o starsze przeglądarki i biblioteki, takie jak Socket.io użyj long-ankiet jako alternatywy w tych przypadkach.

WebRTC

Oprócz tego, co zostało już wspomniane, WebRTC pozwala na komunikację poprzez UDP. UDP od dawna jest używany w grach wieloosobowych w środowiskach Nie opartych na sieci ze względu na jego niski narzut (w stosunku do TCP), niskie opóźnienia i charakter non-blocking.

TCP "gwarantuje", Ĺźe kaĹźdy pakiet dotrze (z wyjÄ ... tkiem katastrofalnej awarii sieci) i Ĺźe zawsze dotrze w kolejnoĹ "ci, w jakiej zostaĹ' wysłany. Jest to świetne rozwiązanie dla krytycznych informacji, takich jak rejestracja wyników, odsłon, Czat i tak dalej.

UDP, z drugiej strony, nie ma takich gwarancji. Pakiety mogą dotrzeć w dowolnej kolejności, albo wcale. Jest to przydatne, jeśli chodzi o mniej krytyczne dane, które są wysyłane z wysoką częstotliwością i muszą dotrzeć tak szybko, jak to możliwe, takie jak pozycje graczy lub dane wejściowe. Powodem jest to, że strumienie TCP są blokowane, jeśli pojedynczy pakiet zostanie opóźniony podczas transportu, co powoduje duże luki w aktualizacjach stanu gry. Dzięki UDP możesz po prostu ignorować pakiety, które przychodzą późno (lub wcale), i kontynuować z następnym otrzymanym pakietem, tworząc płynniejszą doświadczenie dla gracza.

W momencie pisania tego tekstu, WebSockets są prawdopodobnie najlepszym rozwiązaniem, choć adopcja WebRTC rozwija się szybko i może być lepiej, zanim skończysz z grą, więc to jest coś do rozważenia.

 3
Author: Josh Langley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-13 19:18:45

Jeśli planujesz używać JavaScript do swojej gry (tak jak jesteś), to WebSocket jest najlepszym wyborem dla Ciebie. A jeśli chcesz obsługiwać starszą wersję Internet Explorera, pomyśl o Signal r system opracowany przez Microsoft. Używają WebSocket pod maską, ale mają też kilka options...so protokół wykorzysta najlepsze dostępne rozwiązanie.

Http://signalr.net/

 0
Author: MilanG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-08 12:32:28