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:
Client
wysyła token dostępu doServer
Client
otrzymuje akceptację odServer
Client
przełącza scenę na scenę gryServer
wysyła graczy, skrzynki, przedmioty, z którymi możesz wchodzić w interakcje, abyclient
mogli 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
:
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?
unity
networking
maps
Jakub
źródło
źródło
Odpowiedzi:
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
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:
źródło
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 .
źródło
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
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.
źródło