Symulacje fizyczne po stronie serwera z setkami graczy

9

Obecnie pracuję nad jednoosobową grą zorientowaną na fizykę, w której chciałbym, aby fizyka była symulowana po stronie serwera. Wynika to z faktu, że gra będzie miała tabele wyników, trwały postęp gracza itp. I chcę zapobiec wszelkiego rodzaju oszustwom - w zasadzie czystej architekturze klient-serwer, klient jest „głupi” i wyświetla tylko to, co serwer chce wyświetlać.

Problemem jest jednak to, że w tę grę prawdopodobnie będą grać setki (może tysiące) osób jednocześnie. Dotyczy to mnie, ponieważ najprawdopodobniej zabije moc przetwarzania serwera, jeśli będę musiał robić i utrzymywać setki stanów jednocześnie.

Nie miałbym problemów z przeniesieniem wszystkich symulacji fizyki na stronę klienta, ale wtedy naprawdę potrzebowałbym sposobu na sprawdzenie, czy wynik symulacji klienta jest prawidłowy. Nie wiem jednak, jak to zrobić.

Zastanawiałem się nad uruchomieniem symulacji po stronie serwera, aby sprawdzić, czy klient nadal gra uczciwie, ale naprawdę chcę, aby serwer był jak najmniej obciążony.

Fizyka stanie się mniej więcej tak złożona jak demo GDC 2011 autorstwa Glenna Fiedlera , a może nawet prostsza. Jednak o wiele bardziej zderzające się sztywne ciała będą znajdować się w jednej scenie i wszystkie będą widoczne jednocześnie.

Trudno mi znaleźć odpowiedź na ten konkretny przypadek, ponieważ większość zasobów w sieci - znowu, strona Glenna Fiedlera jest świetna - mówi o fizyce na małą skalę (np. FPS z 30 graczami, takimi jak Halo).

Wszelkie porady, strony internetowe, artykuły itp. Na ten temat będą bardzo mile widziane.

Podsumowanie pytań, na które chciałbym odpowiedzieć:

  • Jak wykonalny jest model klient-serwer? Czy moja moc przetwarzania serwera jest uzasadniona i uziemiona?
  • Czy można wiarygodnie zweryfikować symulację fizyczną uruchomioną przez klienta na serwerze? Jeśli tak to jak?
Lennard Fonteijn
źródło
Pozostawię to pytanie trochę dłużej otwarte w nadziei, że więcej osób opublikuje swoje przemyślenia. Dziękuję tym, którzy już to zrobili!
Lennard Fonteijn,
Dopóki różni klienci są niezależni, nie powinno być problemu ze skalowaniem w poziomie. Użyj czegoś takiego jak EC2, w razie potrzeby zwiększ pojemność online.
ipeet
1
Gdzie jest problem, jeśli ktoś oszukuje w grze dla jednego gracza? Po prostu pozwól im, lepiej porzuć pomysł na
tabelę
2
„Czy można wiarygodnie zweryfikować symulację fizyczną uruchomioną przez klienta na serwerze?” Tak, można to zweryfikować, ale czytając poniższe komentarze: Planujesz rozdać pieniądze RL najlepszym wynikom i jest to podobne do gry w rzutki, tj. Po początkowym rzucie fizyką. Problem polega na tym, że walidacja fizyki jest mniejsza, jest to łatwe. Problem polega na tym, że będziesz miał oszustów, którzy pozwolą programowi komputerowemu wykonać rzuty, aby dać im doskonałe wyniki.
Daniel Carlsson,
Potwierdzona przez serwer fizyka we wspólnym świecie jest całkowicie możliwa, DCUO jest tego dobrym przykładem. Pamiętaj, że „serwer” naprawdę oznacza „kilka skrzynek serwerowych”, podczas gdy wydaje się, że piszesz w kategoriach „serwer”, który gdzieś siedzi. Obecnie nie można symulować tysięcy niezależnych aktorów w tej samej przestrzeni fizycznej, a zatem brak dyskusji na ten temat; co możesz zrobić, to rozłożyć tysiące graczy na niezależne wyspy symulacji, które nie wchodzą w interakcje.
Patrick Hughes,

Odpowiedzi:

5

Możesz sprawdzić poprawność zgłoszeń innych użytkowników i zlecić klientowi zgłoszenie do serwera, jeśli zgłoszenie wygląda na nieprawidłowe.

Następnie możesz podjąć działania (albo zablokować oszusta, albo zablokować, kto sfałszował fałszywy raport). Aby sprawdzić, czy przesłanie jest naprawdę nieprawidłowe, możesz użyć specjalnego klienta lub cokolwiek innego.

o0 ”.
źródło
3
To jest naprawdę cholernie mądre! Nie pomyślałbym o tym, oczywiście co najmniej 2 lub 3 klienci musieliby uruchomić symulację na wypadek, gdyby klient prowadzący kogoś innego, jego symulacja oszukiwała - w takim przypadku serwer może zawsze wykonać ostatnią symulację, jeśli wszyscy klienci zgłoszą coś dziwnego .
Lennard Fonteijn
1

Twoja gra jest dla jednego gracza, jedyną „interakcją” z innymi graczami jest lider. Możesz odrodzić instancję, aby sprawdzić symulację na serwerze dla każdego zgłoszenia, nie potrzebujesz wszystkich sztuczek, aby upewnić się, że fizyka jest taka sama dla ponad 30 klientów, więc nie sądzę, że potrzebujesz więcej zasobów niż wcześniej fizyka już działa :).

Sprawdzanie każdego wyniku będzie trochę przesadne, możesz wysłać symulację skompresowaną na serwer za każdym razem, gdy ktoś wyśle ​​wynik do lidera, a następnie sprawdź tylko 5% najlepszych wyników na twoim serwerze, a może nawet najwyższy 1%, a nawet mądrzejsi sprawdzają tylko nowe rekordy i zakładają, że każdy nie lepszy niż nr 1 prawdopodobnie ma nie oszukaną symulację.

Nie wiem, czy twoja symulacja jest podobna, skonfiguruj ją i nie wchodź w interakcje (łatwe do sprawdzenia), czy też gracze mogą wchodzić w interakcje z symulacją podczas jej działania, ale pamiętaj, aby wykonać swoją fizykę w taki sposób Reprezentacje punktów nie psują rzeczy i sprawiają, że poprawny przebieg wygląda na nieprawidłowy.

Roy T.
źródło
Nie chcę wchodzić w szczegóły samej rozgrywki, ale możesz porównać moją grę z grą w rzutki: po tym, jak celujesz i wykonujesz rzut, fizyka przejmuje kontrolę i nie możesz nic zmienić już. Czy ta wiedza zmieni twoją odpowiedź?
Lennard Fonteijn
Nie, nic by to nie zmieniło :). Po prostu przechowuj powtórki na serwerze i sprawdzaj tylko podejrzane (np. Nowe rekordy)
Roy T.
1

Nie rób tego, zapewniam cię, że symulowanie fizyki wyłącznie na serwerze to bardzo zły pomysł. Głównym problemem nie jest obciążenie serwera, ale czas reakcji. Reakcja klienta będzie bardzo słaba. Gracz wciśnie przycisk, a następnie będziesz musiał odbyć podróż do serwera w obie strony, zanim uzyskasz wyniki symulacji. W przeszłości robiłem różne warianty (głównie tylko naciśnięcia przycisków), a wyniki nie są ładne i powinny być wykonywane wyłącznie w przypadku bardzo wolnych gier, które mają szanse na ucieczkę (a nawet w tych przypadkach postrzeganych brak reakcji to ogromny problem).

Lepszym schematem, który zamierzałem wypróbować następnym razem, gdy tego rodzaju scenariusz się zaprezentuje, jest wybranie graczy bardzo małego podzbioru twojej bazy graczy, a następnie symulacja dla nich po stronie serwera i porównanie twoich wyników z ich wynikami, bez ich wiedzy. Jeśli różnią się zbytnio (musisz spodziewać się pewnego stopnia rozbieżności), klasyfikujesz ich jako potencjalnych oszustów i kontynuujesz ich symulację jeszcze przez chwilę, aby to potwierdzić. Otrzymasz krzywą o to, o ile legalny gracz różni się od serwera, na co wpływ mają warunki sieciowe itp., A szybko zauważysz, że oszustów są poza tą krzywą. Ten system ma następujące zalety:

  • Zautomatyzowane
  • Nie poświęcasz czasu reakcji
  • Gdy tylko symulujesz bardzo mały podzbiór bazy gracza, obciążenie będzie możliwe do zarządzania, a nawet skalowalne (być może wybierzesz mniej graczy do symulacji, jeśli obciążenie jest wysokie)
  • Odnosi się do każdej gry, o której myślę, więc jest bardzo wielokrotnego użytku
Ylisar
źródło
Tak jak Roy, w zasadzie mówisz: Zachowaj to po stronie klienta, przechowuj „powtórki”, gdy klienci przesyłają ocenę, i sprawdzaj te powtórki tylko raz na jakiś czas (nie wszystkie, niewielki procent). Co się stanie, jeśli na podstawie wyniku klient prześle wypłatę kredytu - część progresji gracza, kredyty można również kupić za prawdziwe pieniądze (!!!) - czy nadal polecasz to podejście? Gdyby oszustwo dawało nadmierne kwoty kredytów, a ja zatwierdzam je tylko raz na jakiś czas, zasadniczo straciłbym pieniądze. Prawdopodobnie możesz oflagować osobę, gdy jej wynik przekroczy określony próg, ale czy byłby lepszy sposób?
Lennard Fonteijn
Jeśli silnik fizyki jest deterministyczny (powinien być), a serwer symuluje przy użyciu tego samego stanu początkowego i danych wejściowych co klient (co powinno być wykonalne), wówczas wyniki powinny mieścić się w rozsądnych granicach błędu zmiennoprzecinkowego (nieznaczne). Nawet jeśli występują losowe efekty i nie jest możliwe przerzucenie stanu RNG, możesz pominąć losowe liczby i użyć ich do sprawdzenia (a nawet sprawdzić ich rozkład, na wypadek, gdyby fudowanie losowych rzutów miało dużą różnicę w rozgrywce) .
ipeet
Są w to zaangażowane kredyty, więc lepiej sprawdzaj każdą powtórkę, ponieważ oszukiwanie nie polega już na zdobywaniu listy najlepszych wyników, ale na zdobywaniu pieniędzy. Chcesz dużo więcej bezpieczeństwa, jeśli zaangażowane są pieniądze, nie mogę ci pomóc.
Roy T.
@RoyT. Prawdopodobnie i tak to zrobię, nawet jeśli nie wypłacę pieniędzy na podstawie kredytów (chyba ktoś źle odczytał?). Zamierzam mieć politykę zerowej tolerancji, więc po prostu wsadowałem plik powtórki do weryfikacji. Jeśli to naprawdę podejrzane, podejmuję działania.
Lennard Fonteijn,
1

Jak stwierdził Daniel, dużym problemem tutaj będą programy, które wykonują akcję dla gracza; nie byłoby konieczne wypaczanie fizyki w grze, gdyby gracz był robotem z precyzją normalnie rozwiązywaną do neurochirurgii.

Jakiś facet
źródło
Mogłem być trochę niejasny. Moje gry zapewnią ci wirtualne kredyty po ukończeniu gry. Możesz użyć tych kredytów, aby odblokować nową zawartość do zabawy. Możesz także użyć prawdziwych pieniędzy, aby kupić kredyty, aby szybciej odblokować zawartość (pamiętaj, że to nie Pay2Win, nienawidzę tego). Nie mam zamiaru wypłacać prawdziwych pieniędzy na podstawie kredytów. To powiedziawszy, rzutki były tylko metaforą opisującą, jak duży gracz ma wpływ na stan ciał sztywnych, nie boję się „aimbots”, ponieważ da to 0 przewagę.
Lennard Fonteijn