Czy w nowoczesnych grach dla wielu graczy ogromne, statyczne obiekty, takie jak środowisko, są przesyłane z serwera do klienta?

18

Mam autorytatywny system, w którym gdy gracz dołącza do meczu, otrzymuje wszystkie już odrodzone obiekty - odradza się na sobie (klient).

To wygląda tak:

  1. Client wysyła token dostępu do Server
  2. Client otrzymuje akceptację od Server
  3. Client przełącza scenę na scenę gry
  4. Serverwysyła graczy, skrzynki, przedmioty, z którymi możesz wchodzić w interakcje, aby clientmogli się odrodzić i wyświetlić je.

Ale co z obiektem naziemnym? Na razie mam dokładnie tę samą scenę na serwerze i kliencie - z jedną statyczną płaszczyzną działającą jak podłoga. Obecnie dodaję nowe rzeczy, drzewa, schody i buduję razem.

Myślałem - jesteśmy dobrzy. Ale czy środowisko nie powinno być również synchronizowane? Być w jakiś sposób połączony w sieć? Należący do serwera?

Weźmy League of Legends:

wprowadź opis zdjęcia tutaj

Jest to środowisko statyczne, prawdopodobnie jedna połączona siatka (schody, trawa, ściany, sklep). Ale czy naprawdę jest on przechowywany na kliencie, czy też jest wysyłany przez serwer podczas ekranu ładowania?

Jakub
źródło
1
Możesz nawet o tym pomyśleć od momentu, w którym możesz dodać niestandardowe skórki do postaci i środowiska ligi. Nie wysyłasz ich do zerwania, są one wyświetlane lokalnie, więc warto dojść do wniosku, że są one przechowywane i renderowane lokalnie. Również nie wpływają na rozgrywkę, jeśli pytasz o kolizje, są mieszanką serwera i klienta, dzięki czemu gracz nie może oszukiwać i przechodzić przez ściany.
Candid Moon _Max_

Odpowiedzi:

41

W większości przypadków nie, żadne zasoby artystyczne nie są rutynowo przesyłane przez sieć. Zasadniczo wszyscy klienci będą mieć lokalnie te same zasoby treści. Może istnieć kod zapewniający, że tak jest, poprzez sprawdzenie treści lub temu podobne. Jeśli obawiasz się, że użytkownicy będą manipulować niektórymi treściami po stronie klienta, możesz wdrożyć podobny system.

Serwer może wysyłać do klienta dyrektywy wskazujące, że powinien wyświetlić lub ukryć określone zasoby, ale nie wyśle ​​rzeczywistych danych zasobu. Jest to w praktyce zbyt marnotrawne i powolne i może powodować rzeczywiste problemy z ludźmi z ograniczonymi dostępnymi danymi.

W niektórych przypadkach mniejsze zasoby mogą być przesyłane strumieniowo w całości, jeśli są one w jakiś sposób uważane za „spoiler” lub coś w tym rodzaju. Ale to rzadkie. Ogólnie rzecz biorąc, widzisz, że gra może pobierać nową zawartość z poprawki lub cokolwiek innego, ale stanie się to tylko raz, podczas procesu łatania podczas uruchamiania. Nie podczas gry.


źródło
21
Pamiętaj, że ta odpowiedź dotyczy tylko zasobów statycznych. Materiały dynamiczne / generowane przez graczy (np. Fragmenty świata Minecraft lub logo gildii MMORPG, które gracze mogą przesyłać) będą musiały zostać przesłane. Ale nawet wtedy zwykle próbuje się zminimalizować ilość potrzebnych danych (aby kontynuować przykład Minecraft: wysyłanie aktualizacji bloków zamiast całych fragmentów, tylko wskazując typ / stan bloku i współrzędną, które się zmieniły) i / lub buforować dane po stronie klienta .
hoffmale
@hoffmale Tak, dobra uwaga; pytanie, o którym wspominano, na końcu krajobraz był statyczny, więc nie pomyślałem o podniesieniu tego punktu, ale jest dobry.
3
Jeśli zasób jest spoilerem, zwykle zasób jest na kliencie, szyfrowany, a klucz deszyfrujący jest przesyłany z serwera do klienta, gdy zasób jest potrzebny.
Grant Davis,
4
I na przykład, jeśli chcesz losowo umieścić drzewa na mapie, zamiast wysyłać współrzędne drzew do klienta, wysyła ono ziarno (generatora liczb losowych) do klienta.
Grant Davis,
5

Zależy od kilku czynników, w tym od rodzaju gry (tutaj założę RTS, choć przychodzi mi na myśl także gra MMO w otwartym świecie). Podstawowy stan terenu lokalny dla gracza jest albo wysyłany przy połączeniu, albo stanowi część zasobów klienta - pomyśl o grze RTS, w której mapa jest albo dostarczana z klientem, albo pobierana przed rozpoczęciem gry.

Rzeczywiście, siatka zwykle nie byłaby wysyłana, ponieważ byłaby już na kliencie w większości przypadków RTS. To, czy zostanie wysłana mapa kolizji, która jest naprawdę kluczowa dla utrzymania synchronizacji między nimi , jest innym pytaniem. Ale w większości RTS byłoby to ponownie wstępnie zapisane na kliencie.

Tak naprawdę wszystko zależy od tego, z czym jest dostarczany Twój RTS, niezależnie od tego, czy pobierasz mapy przed czasem gry, czy w momencie rozpoczęcia gry.

Następnie istnieje kilka typowych sposobów synchronizacji:

  • Delty są wysyłane do klienta - najczęstszy i najskuteczniejszy sposób na aktualizowanie świata lokalnego / klienta na serwerze;
  • Sumy kontrolne są czasami wysyłane albo z serwera do klienta, albo z klienta na serwer, aby upewnić się, że stan świata rzeczywiście pasuje;
  • Czasami pełny stan jest ponownie wysyłany w celu ponownej synchronizacji klienta - często z powodu problemów technicznych, takich jak dryfowanie zmiennoprzecinkowe.
Inżynier
źródło
4

Co do dokładnie zadanego pytania, nie wiem, w jaki sposób League of Legends sobie z tym poradzi. Nigdy nie grałem w tę grę, więc nie mogę zasugerować, czy musi.

Ale ogólnie odpowiedź na twoje pytanie jest dość prosta:

Jeśli dane są statyczne i wiesz na pewno , że nigdy się nie zmienią (poza okresowymi aktualizacjami pełnej wersji gry, ale to osobno), to dlaczego miałbyś chcieć wysłać te dodatkowe dane? Zwykle starasz się unikać wysyłania wszystkiego, czego można uniknąć. Wysyłaj dane tylko wtedy, gdy taka komunikacja jest potrzebna .

Z drugiej strony, jeśli dane zmienią się w czasie lub jeśli chcesz pozostawić tę opcję otwartą, to czy naprawdę masz jakiś wybór w tej sprawie? W takim przypadku musisz wysłać dane. W przeciwnym razie klient nie ma tego, czego potrzebuje.

Dotyczy to całej komunikacji sieciowej, nie tylko danych o terenie. Wszystko .

Aaron
źródło
2

Nie.

Zrobiłem uczciwie kopanie w źródle League of Legends i wszystko, w tym modele Bohaterów, Sklepikarz, ogólne tło mapy i puchate stworzenia dodane po fakcie (jak mała wiewiórka na niektórych skałach i ślimak w rzeka) są przechowywane po stronie klienta. Fakt, że klient ma wszystkie te modele, jest jednym z powodów, dla których LoL ma wiele gigabajtów.

Przeniesienie wszystkich tych danych z serwera do klienta byłoby piekielne, nie wspominając o przeżyciu przepustowości, aby zrobić to wszystko ponownie w następnej grze.

Jak zatem to rozwiązać? Każdy gracz wysyła TYLKO dane, które są ważne dla innych graczy w grze na serwer. Nikt nie musi wiedzieć, czy masz 5 sekund czasu odnowienia Q, czy też Głęboka Terror Thresh Skin tworzy dla ciebie bąbelki. Rzeczy, które są przekazywane w grze, to: Vel'Koz rzucił Q, Viktor przesunął się w lewo itp.

Mówiąc ściślej, w odniesieniu do ekranu ładowania, gdy o tym wspomniałeś, zdarzają się takie rzeczy, jak łatki w połowie łaty, o których każdy gracz musi porozmawiać z serwerami zamieszek przed rozpoczęciem gry, bezpieczne uzgadnianie połączeń i protokoły przeciw oszustwom.

UWAGA:

Jeśli chcesz rozejrzeć się po tym, co ma klient, a zatem serwer cię nie przepuści, znajdź folder C: \ Riot Games \ RADS \ lol_Game_Client \ Projects (może to być trochę nieuprzejmi, przepraszam, ja ” pracuję teraz nad pamięcią) i znajdź online rozpakowanie plików .RAF. Następnie możesz zobaczyć wszystkie rzeczy, które są przechowywane lokalnie, takie jak ładowanie plam na ekranie i tekstur skóry, nawet szkielety bohaterów.


źródło
1
Wydaje się, że oczywistym sposobem na wdrożenie tego byłoby posiadanie przez klienta (z dedykowanego serwera zasobów) wszelkich zasobów, które nie zostały jeszcze zapisane lokalnie, a kiedy je odbiera, dodaje je (częściowo) na stałe do swojego lokalny stały sklep na dysku. W ten sposób zasoby są pobierane tylko raz i tylko wtedy, gdy są rzeczywiście potrzebne. (Gdy to zadziała, optymalizacja polegałaby na wstępnym wypełnieniu lokalnego sklepu klienta zasobami, które najprawdopodobniej będą potrzebne. Skróciłoby to czas uruchamiania gry przy pierwszym połączeniu, kosztem zwiększenia pakietu instalatora gry)
Jeremy Friesner,
1
@JeremyFriesner Dlaczego to byłby oczywisty sposób? To brzmi gorzej niż obecna implementacja opisana w tym poście, która wymaga wcześniejszego zainstalowania wszystkich zasobów, dzięki czemu są one natychmiast dostępne, gdy są potrzebne. Może się to udać w przypadku gry dla jednego gracza, ale myślę, że wiele osób wolałoby dłuższy czas instalacji (i więcej miejsca na dysku) niż ciągłe czekanie na pobranie nowych zasobów podczas gry.
Anthony Grist,
2
Do gry wieloosobowej? Absolutna katastrofa. Nie chcesz, aby każdy inny gracz czekał na rozpoczęcie gry, ponieważ jedna osoba musi pobrać zasoby, których nigdy wcześniej nie potrzebowała.
Anthony Grist,
1
@AnthonyGrist Dlatego wiele gier, takich jak League of Legends, wymaga od gracza pobrania wszystkich zasobów gry przed dołączeniem do kolejki w celu znalezienia meczu. Działa to znacznie lepiej niż opóźnienie w grze podczas oczekiwania na duży zasób. Należy pamiętać, że w tym rodzaju gry gracze są podekscytowani zmniejszeniem ping o 10 ms i często bawią się pingiem <50 ms i mogą stwierdzić, czy przeskakuje on do zakresu od 100 do 150. Oczekiwanie na pobranie zasobu podczas gry byłoby katastrofą w MOBA lub FPS, a jeśli zdarzy się w niewłaściwym czasie, może nawet zmienić wynik gry.
JustWannaFly,
@AnthonyGrist (ciąg dalszy) Myślę, że możesz pomyśleć o tym w ten sposób. W niektórych grach wieloosobowych / rywalizacyjnych gracze wymieniają dłuższy czas ładowania / łatania / instalacji na grę w czasie rzeczywistym, ponieważ klient zajmuje się aktualizacją i wprowadzaniem do kolejki. To sprawia, że ​​tylko konkretny gracz potrzebujący zasobów musi czekać, chyba że chce dołączyć do wstępnie przygotowanej drużyny, a następnie wszyscy gracze w drużynie będą musieli poczekać, aby wejść do kolejki i znaleźć przeciwników
JustWannaFly
1

Przykładem tego, że nie zostało to zrobione, było The Elder Scrolls Online, w którym ufał on klientowi co do wysokości poziomu gruntu .

Górnicy zrzucili ziemię na kilka stóp. Mogli następnie chodzić „pod” terenem i wydobywać zasoby od dołu, nie będąc widzialnym przez komputery PC ani atakowanym przez NPC.

Podobne zmiany pozwoliły im wygładzić klify, aby mogli po nich chodzić, usuwać lub przechodzić pod statycznymi ścianami, widzieć wszystkie obiekty statyczne itp.

Zasadniczo serwer ufał klientowi co do lokalizacji gracza, obliczanie kolizji po stronie serwera dla każdego gracza wbrew wszelkim statystykom byłoby dość ciężkie.

W grach opartych na kafelkach, takich jak Furcadia, jest jednak inaczej: każdy kwadrat, na który się poruszasz, ma walkabilty po stronie serwera, a serwer nie musi ufać klientowi w żaden sposób: serwer zna i zatwierdza każde ruch i akcję użytkownika, oraz klient wyświetla akcję tylko wtedy, gdy serwer podaje wynik.

Dewi Morgan
źródło
1
TL; DR: Zawsze zakładaj, że klient jest kłamcą, oszustem, dropem . Ale sprawdzanie poprawności wszystkiego przez serwer obniża Twoją pojemność.
Draco18s,