networking multiplayer con la fisica


12

Sono curioso di sapere come sia implementata la rete multiplayer con la fisica nei giochi di corse. Abbiamo un mondo fisico con più veicoli in rapido movimento controllati da persone diverse. Diciamo che i veicoli hanno armi e possono spararsi a vicenda (Twisted Metal, Vigilante v8)

Sono ansioso di successi e collisioni. Server autorevole o un'alternativa migliore?

Risposte:


5

Di solito, viene utilizzato un server, che memorizza lo stato "verità" che viene periodicamente condiviso con i client. Le collisioni avvengono in modo indipendente nei client e nei server, con gli stati dei client stimati dagli stati precedenti usando un processo simile a quello che di solito si chiama Dead Reckoning . Quando uno stato del server raggiunge un client, se ci sono differenze, il client esegue una transizione dal suo stato corrente a quello appena ricevuto principalmente attraverso l'interpolazione.

Tuttavia, con molti oggetti le collisioni possono essere un vero problema, quindi ciò che viene comunemente fatto è mantenere un po 'indietro il tempo simulato dei Clienti rispetto al tempo simulato del Server per consentire vari gradi aggiuntivi di flessibilità. Questo articolo sul netcode del motore di origine di Valve è abbastanza esplicativo. Inoltre, se sei ancora indeciso su quale middleware / libreria di rete utilizzare, ti suggerisco di esaminare RakNet e il suo componente "ReplicaManager3" .


2

Ci sono diverse cose che puoi fare.

  1. Puoi centralizzare tutti gli oggetti fisici sul server e sincronizzare le coordinate con gli oggetti giocatori su tutti i client. Questo è il più semplice e funziona senza molti difetti, tuttavia utilizza molte risorse e richiede molta larghezza di banda. Puoi ottimizzare l'utilizzo della larghezza di banda inviando valori al giocatore di altri giocatori che si trovano entro un certo raggio.

  2. Puoi fare come menzionato Neenster e far simulare la fisica al server e ai client, ogni tanto il server correggerà i client. Ciò significa che tutti i client calcolano la propria fisica per ogni giocatore e si sincronizzano gli eventi di pressione dei tasti sul server fornendo la traiettoria di ciascun giocatore su ogni client. Diciamo che ogni 5 secondi il server trasmette la sua simulazione fisica e tutti i client accettano la modifica. Questo può creare lievi offset che sono impercettibili la maggior parte delle volte, ma durante il ritardo della rete e la perdita di pacchetti (inevitabile con UDP ad alto traffico) noterai che il tuo giocatore e / o altri giocatori si muovono in modo anomalo sullo schermo e cambiano posizione rapidamente e in modo discontinuo (è che un parola?).

  3. Puoi fare in modo che ogni cliente calcoli la propria fisica e sincronizzi le sue coordinate. Ciò rende difficile simulare la fisica sugli oggetti condivisi tra i client. È un concetto piuttosto complesso da implementare se vuoi fare qualcosa di elegante, perché un determinato oggetto non appartiene necessariamente a nessun client.

Il primo è probabilmente il più semplice e dovrebbe permetterti di avere circa 4-5 giocatori con un piccolo ritardo. Richiederebbe che ogni partita abbia il proprio server. Se stai facendo partite LAN questo è senza dubbio la strada da percorrere.

Il secondo è probabilmente il più pratico, tuttavia può essere difficile da implementare. È anche piuttosto ingegnoso eseguire simulazioni fisiche sul server. Se disponi di server centralizzati, probabilmente dovrai caricare il bilanciamento su più macchine, magari consentire 10 partite a un server, caricare nuove partite sul server con il minor numero di partite.

Il terzo è sicuramente il meno stressante sul server ed è probabilmente la soluzione migliore se stai facendo uno schema di rete peer to peer. Come ho già detto, può essere difficile sincronizzare oggetti diversi dall'oggetto giocatore perché tali oggetti sono modificabili anche da altri client.

Non posso dirti quale usare perché non so come funziona il tuo gioco. Tutto quello che posso fare è darti i fatti. Se hai ulteriori domande, non esitare a commentare.


Suggerisci che lasciare che i clienti facciano la sua fisica è una soluzione accettabile, ma non ti sei relazionato con l'inganno.
cubuspl42,

@ cubuspl42 Per lo sforzo di rimanere in tema ho omesso i dettagli. Ritengo opportuno che l'OP possa esplorare ulteriormente la soluzione per esplorare i potenziali modi per mitigare i tradimenti.
tsturzl,

uno di questi modi è consentire che la deviazione di ciò che ciascun cliente fornisce sia limitata a una soglia. Ad esempio, la maggior parte dei client afferma che un determinato oggetto si trova nella posizione 5,8 o 6,9 ma uno riporta 12,19 come coordinata, che potrebbe cadere fuori da una soglia rispetto a quanto si discosta dagli altri client. Questa è solo una soluzione parziale, ma la maggior parte dei giochi offre solo soluzioni parziali per imbrogliare, quindi perché succede ancora. Questa soluzione non significa che imbrogliano, ma significa che il loro posizionamento deve essere corretto e sembrerebbe un ritardo per loro.
tsturzl,

Bene, sono leggermente in disaccordo. Alcuni tipi di cheat sono risolvibili, altri no. Ad esempio, secondo me è un cattivo design del gioco se si può fare uno speedhack per uno sparatutto online competitivo. O qualche hack pazzo che ti permette di volare sulla mappa con una modalità god e infinite munizioni (credo che sia successo in Crysis 1 ad un certo punto). Questi sono riparabili, basta progettare correttamente il gioco. Roba come wallhack è quasi impossibile da risolvere (richiederebbe enormi risorse dal server). Aimbot è praticamente impossibile. La tua soluzione n. 3 aumenta il rischio di questo peggior tipo di trucchi.
cubuspl42,

@ cubuspl42 Penso che ti manchi l'idea di cosa sia un esempio. L'opzione 3 può prevenire esattamente il problema di cui stai parlando. In genere avrai un TCP che condivide la velocità e quindi puoi facilmente controllare la velocità tra i client e formare un consenso, puoi anche fare qualche semplice calcolo matematico per determinare se le coordinate di UDP sono plausibili data la velocità fornita supponendo che i tuoi clienti abbiano un orologio sincronizzato (può essere stabilito sulla connessione dall'orologio HW).
tsturzl,
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.