Come sincronizzare azioni come saltare in multiplayer?


11

Sono uno sviluppatore di giochi per principianti e ho fatto ricerche sui giochi multiplayer. Ho osservato che c'è sempre un po 'di latenza, i giocatori ricevono sempre aggiornamenti dalle azioni passate. Ma ci sono tecniche come la resa dei conti morta per gestire la latenza. Posso prevedere il movimento e rendere i movimenti fluidi. Ma come farei sincronizzare le azioni come saltare, smettere di camminare, ecc.

Supponiamo che il cliente A si stesse muovendo, era a 100m a 10,2 volte con una velocità di 100m / sec e ha inviato queste informazioni. Il cliente B riceverà queste informazioni un po 'più tardi, lascia che sia 10.4. Quindi sul client B, posso usare la previsione e posizionare il client A a 120m. E se il cliente avesse fatto un salto a 110m alle 10.3. Non posso prevederlo e dal momento che ho usato la previsione non posso mostrare al cliente un salto nel passato.

Potrei affrontare questo problema non inviando alcuna azione di salto. E se il mio gioco avesse dei vuoti in cui i giocatori potevano cadere e morire. Quindi, se non sincronizzo le azioni di salto, gli altri giocatori osserveranno che un giocatore stava correndo, quindi cade nel vuoto e quindi appare di nuovo sullo schermo distruggendo l'impegno visivo.

Il salto è solo un esempio, potrebbero esserci molti scenari in cui la previsione non può funzionare. Quindi, come gestirli. Uno di questi esempi può essere quello di giochi di arena di battaglia multiplayer online come Awesomenauts.


Non so molto di Multiplayer, quindi non sarò in grado di dare una risposta adeguata. Ma da quello che ho raccolto, la configurazione ideale sarebbe che i tuoi clienti sarebbero più o meno stupidi e manderebbero solo tastiera, mouse, gamepad o qualsiasi input al server, e il server fa tutto quel movimento e tutto il mondo aggiornando cose e invia posizioni e tutti gli altri dati rilevanti ai clienti, che quindi visualizzano il risultato. Tutto ciò elimina la previsione e cose simili.
Christian,

@Christian hey! Grazie per la risposta. Conosco questo approccio, ma questo può rendere il gioco a scatti se la latenza è alta e inoltre uso il sistema in tempo reale BaaS di AppWarp, quindi tutta la mia logica è solo sul lato client.
Suyash Mohan,

La combinazione di entrambi i metodi è il server autorevole. Sia i client che i server simulano, i client inviano i loro input, il server restituisce lo stato autorevole. I clienti regolano il proprio stato in modo che corrisponda allo stato autorevole. Quindi, quando gli stati corrispondono, i client funzionano come se fossero simulati localmente (nessun ritardo).
MichaelHouse

di recente ho trovato questa serie di tutorial per dare buoni consigli sulla gestione della latenza, sembra che sarebbe rilevante per i tuoi interessi: link
Kris Welsh

Risposte:


8

La resa dei conti morta potrebbe non essere la migliore idea in questo caso; dovresti fare l'interpolazione delle entità (rendendoti efficacemente gli altri giocatori in passato, il che ti dà sempre posizioni reali e valide). Ho scritto su questo con molti più dettagli qui . Se vedere o meno i giocatori in passato è accettabile o meno dipende dai dettagli di ciò che stai cercando di fare.


4
Ho usato questo approccio quando ho scritto il mio primo gioco multiplayer in rete. In effetti ho usato @ ggambett come riferimento. Ha funzionato bene nel mio caso.
NoobsArePeople2

1

C'è un resoconto abbastanza dettagliato riguardo al motore sorgente. Sembrerebbe che parte del codice sorgente pertinente sia disponibile anche come parte dell'SDK di origine.

https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking

Utilizza una serie di tecniche per provare a gestire la latenza di rete in un modello server-client. Il punto principale sembra essere che il client locale gestisca l'input e altri eventi localmente come se non ci fosse un server, e quindi si occuperà della possibilità che il server dica che il client ha sbagliato in seguito.

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.