Simulazioni fisiche lato server con centinaia di giocatori


9

Attualmente sto lavorando a un gioco orientato alla fisica per giocatore singolo in cui vorrei che la fisica venisse simulata sul lato server. Questo perché il gioco avrà classifiche, progressione persistente del giocatore, eccetera e voglio prevenire qualsiasi tipo di imbroglio - fondamentalmente un'architettura client-server pura, il client è "stupido" e mostra solo ciò che il server vuole che tu mostri.

Il problema tuttavia è che molto probabilmente il gioco verrà giocato da centinaia (forse migliaia) di persone contemporaneamente. Questo mi preoccupa, poiché molto probabilmente ucciderà la potenza di elaborazione del server se devo fare e mantenere centinaia di stati contemporaneamente.

Non avrei problemi a spostare tutte le simulazioni fisiche sul lato client, ma avrei davvero bisogno di un modo per convalidare se il risultato di una simulazione client è valido. Tuttavia, non riesco a capire come.

Ho pensato di eseguire la simulazione sul lato server una volta ogni tanto per verificare se il client funziona ancora correttamente, ma voglio davvero che il server abbia il minor sforzo possibile.

La fisica diventerà complessa come la demo del GDC 2011 di Glenn Fiedler , forse anche più semplice. Tuttavia, molti corpi rigidi sempre più in collisione saranno in una singola scena e saranno tutti visibili contemporaneamente.

Ho difficoltà a ottenere una risposta a questo caso particolare, poiché la maggior parte delle risorse sul web - di nuovo, il sito di Glenn Fiedlers è eccezionale - parla di fisica in rete su piccola scala (ad esempio un FPS con 30 giocatori, come Halo).

Eventuali consigli, siti Web, documenti o simili sull'argomento saranno molto apprezzati.

Un riepilogo delle domande a cui vorrei una risposta:

  • Quanto è fattibile un modello client-server? La mia potenza di elaborazione del server è legittima e fondata?
  • È possibile validare in modo affidabile una simulazione fisica eseguita dal client sul server? Se é cosi, come?

Lascerò questa domanda un po 'più a lungo nella speranza che più persone pubblicheranno i loro pensieri. I miei ringraziamenti vanno a quelli che hanno già fatto!
Lennard Fonteijn,

Finché i diversi client sono indipendenti, non dovresti avere problemi di ridimensionamento in senso orizzontale. Usa qualcosa come EC2, porta la capacità online quando necessario.
ipeet

1
Qual è il problema se qualcuno imbroglia in una partita a giocatore singolo? Lascia che siano loro, lascia perdere l'idea della classifica e concentrati sulla creazione di un divertente gioco per giocatore singolo
Maik Semder

2
"È possibile validare in modo affidabile una simulazione fisica eseguita dal client sul server?" Sì, è possibile convalidarlo, ma leggendo i tuoi commenti qui sotto: La tua pianificazione per dare soldi RL ai punteggi migliori, ed è simile a un gioco di freccette, cioè dopo che la fisica del tiro iniziale ha preso il sopravvento. Il problema qui è meno per convalidare la fisica, questo è facile. Il problema è che avrai imbroglioni che permettono a un programma per computer di fare il tiro per dare loro punteggi perfetti.
Daniel Carlsson

La fisica convalidata dai server in un mondo condiviso è del tutto possibile, DCUO ne è un buon esempio. Si noti che "server" significa in realtà "un mucchio di scatole di server" mentre sembra che si scriva in termini di "server" che è una scatola singola seduta da qualche parte. Al momento non è possibile simulare migliaia di attori indipendenti nello stesso spazio fisico, quindi la mancanza di discussione al riguardo; quello che puoi fare è distribuire migliaia di giocatori in isole indipendenti di simulazione che non interagiscono.
Patrick Hughes

Risposte:


5

È possibile convalidare sul lato client gli invii di altri utenti e fare in modo che il client riferisca al server se un invio sembra non valido.

Quindi puoi agire (o vietare l'imbroglione o vietare chi ha falsificato il falso rapporto). Per verificare se tale invio non è realmente valido o meno, è possibile utilizzare un client speciale o altro.


3
In realtà è dannatamente intelligente! Non ci avrei pensato, ovviamente almeno 2 o 3 client avrebbero dovuto eseguire la simulazione nel caso in cui il client che esegue qualcun altro la sua simulazione stia barando, nel qual caso il server può sempre eseguire la simulazione finale se tutti i client segnalano qualcosa di strano .
Lennard Fonteijn

1

Il tuo gioco è singleplayer, l'unica "interazione" con gli altri giocatori è un leaderbord. Potresti generare un'istanza per verificare una simulazione sul tuo server per ogni invio, non hai bisogno di tutti i trucchi per assicurarti che la fisica sia la stessa su oltre 30 client, quindi non penso che tu abbia bisogno di più risorse di quelle che hai già da allora la fisica sta già lavorando :).

Controllando che ogni risultato sarà un po 'eccessivo, potresti inviare la simulazione compressa al server ogni volta che qualcuno invia un punteggio al leaderbord, quindi controllare solo i punteggi migliori del 5% sul tuo server, o forse anche l'1% superiore o addirittura più intelligente controlla solo nuovi punteggi più alti e presumi che tutti non migliori del n. 1 probabilmente abbiano una simulazione non imbrogliata.

Non so se la tua simulazione è simile, configurata e non interagisce (facile da controllare) o se i giocatori possono interagire con la sim mentre è in esecuzione, ma assicurati di fare la tua fisica in modo che galleggi diversi le rappresentazioni dei punti non rovinano le cose e rendono una corsa valida non valida.


Non voglio entrare nei dettagli del gameplay stesso, ma puoi confrontare il mio gioco con quello del gioco delle freccette: una volta che hai mirato e fatto il tiro, la fisica prende il sopravvento e non c'è nulla che tu possa cambiare al riguardo più. Questa conoscenza cambierebbe la tua risposta?
Lennard Fonteijn

No, non cambierebbe nulla :). Memorizza i replay sul server e controlla solo quelli sospetti (ad es. Nuovi punteggi migliori)
Roy T.

1

Non farlo, ti posso assicurare che simulare la fisica esclusivamente sul server è una pessima idea. Il problema principale non è il carico del server, ma la reattività. La reattività sul client sarà incredibilmente scarsa. Il giocatore premerà un pulsante, quindi dovrai fare un giro sul server prima di ottenere i risultati della simulazione. Ho fatto variazioni di questo in passato (per lo più solo premendo un pulsante), e i risultati non sono belli e dovrebbero essere fatti solo per giochi molto lenti che hanno qualche possibilità di cavarsela (e anche in quei casi il percepito la mancanza di reattività è un grosso problema).

Uno schema migliore che ho intenzione di provare la prossima volta che questo tipo di scenario si presenta è quello di scegliere i giocatori un sottoinsieme molto piccolo della tua base di giocatori, quindi simulare per loro lato server per un breve periodo e confrontare i risultati con i loro, a loro insaputa. Se stanno deviando troppo (devi aspettarti alcuni gradi di divergenza), allora li classifichi come potenziali imbroglioni e continui a simularli per un po 'più a lungo per confermare. Ciò che otterrai è una sorta di curva di quanto un giocatore legittimo diverga rispetto al server, influenzato dalle condizioni della rete ecc. E vedrai rapidamente che i truffatori sono al di fuori di questa curva. Questo sistema ha i seguenti vantaggi:

  • Automated
  • Non sacrifichi la reattività
  • Man mano che simuli un sottoinsieme molto piccolo della tua base di giocatori, il carico sarà gestibile e persino scalabile (forse scegli meno giocatori per simulare se il carico è elevato)
  • Applicabile a tutti i giochi a cui riesco a pensare, così altamente riutilizzabile

Quindi, come Roy, in pratica dici: tienilo sul lato client, memorizza i "replay" quando i clienti inviano un punteggio e convalidano questi replay solo una volta ogni tanto (non tutti, una piccola percentuale). Che cosa succede se in base al punteggio che il cliente invia viene eseguito un pagamento del credito - la parte relativa alla progressione del giocatore, i crediti possono anche essere acquistati con denaro reale (!!!) - consiglieresti ancora questo approccio? Se imbrogliare dà un numero eccessivo di crediti e lo convalido solo una volta ogni tanto, perderei sostanzialmente denaro. Probabilmente puoi contrassegnare una persona quando il suo punteggio supera una certa soglia, ma ci sarebbe un modo migliore?
Lennard Fonteijn

Se il motore fisico è deterministico (dovrebbe essere) e il server simula utilizzando lo stesso stato iniziale e gli input del client (che dovrebbe essere fattibile), i risultati dovrebbero essere entro limiti di errore in virgola mobile ragionevoli (insignificanti). Anche se ci sono effetti casuali, e non è possibile passare sopra lo stato RNG, puoi passare i numeri casuali e usarli per il controllo (e persino controllarne la distribuzione, nel caso in cui il lancio di rotoli casuali faccia una grande differenza di gioco) .
ipeet

I crediti sono coinvolti, è meglio controllare ogni singolo replay poiché l'imbroglione non è più per entrare in cima alla lista dei punteggi migliori, ma per ottenere soldi. Volete molta più sicurezza se sono coinvolti soldi, non posso aiutarvi lì.
Roy T.

@RoyT. Probabilmente lo farò comunque, anche se non pago i soldi in base ai crediti (qualcuno ha letto male che immagino?). Ho intenzione di avere una politica di tolleranza zero, quindi ho semplicemente messo in batch il file replay per la convalida. Se è davvero sospetto, prendo provvedimenti.
Lennard Fonteijn,

1

Come ha affermato Daniel, il grande problema qui saranno i programmi che eseguono l'azione per il giocatore; nessuna inclinazione fisica nel gioco sarebbe necessaria se il giocatore fosse un braccio robotico con precisione normalmente risolta per neurochirurgia.


Potrei essere stato un po 'poco chiaro. I miei giochi ti concederanno crediti virtuali dopo aver completato un gioco. Puoi usare questi crediti per sbloccare nuovi contenuti con cui giocare. Puoi anche usare soldi veri per acquistare crediti per sbloccare i contenuti più velocemente (attenzione, non è Pay2Win, lo odio). Non ho intenzione di pagare soldi veri in base ai crediti. Detto questo, le freccette sono state solo una metafora per descrivere quanta influenza ha un giocatore sullo stato dei corpi rigidi, non ho paura dei "robot di mira" in quanto ti daranno 0 vantaggi.
Lennard Fonteijn,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.