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?
źródło
Odpowiedzi:
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.
źródło
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.
źródło
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:
źródło
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.
źródło