Come gestire i movimenti casuali in tempo reale con la previsione lato client


10

Sto realizzando un gioco multiplayer in tempo reale che esegue lo stesso ciclo "fisico" su client e server. Sto usando un comportamento di "vagabondaggio" che è un movimento casuale essenziale. Il client e il server generano numeri casuali diversi durante l'esecuzione degli algoritmi erranti.

Mi chiedo come posso mantenere un movimento dall'aspetto naturalmente casuale ma usare una costante che assicurerà che il client e il server giungano alla stessa conclusione.


4
Generare la stessa sequenza casuale da una sequenza numerica pseudo casuale è facile. La cosa difficile è sincronizzare l'uso di quella sequenza. Devi rendere deterministica la logica del tuo gioco, non nel senso che non stai usando una sequenza casuale, ma per usare la sequenza casuale in modo deterministico. Il modo più semplice per raggiungere questo obiettivo è di solito evitare qualsiasi concorrenza nel loop della logica di gioco, tuttavia è possibile avere la concorrenza fintanto che i thread non dipendono dai tempi e dal sequenziamento del PRNG quando si richiede al PRNG un valore casuale. Ecco il drago.
Lie Ryan

Risposte:


14

Puoi usare semi casuali . Seleziona lo stesso valore a 32 bit nel server e nel client (o il server può inviarlo al client all'avvio). Usalo come seme per generatore casuale. Puoi inviare il seed effettivo dal server al client con l'aggiornamento dello stato del gioco. Se non si desidera inviarlo, è necessario assicurarsi che client e server generino lo stesso numero di numeri casuali da questo generatore casuale.

Cosa dovresti sapere prima di decidere di non inviare il seme effettivo al client:

  • Avrai problemi con l'abbattimento dei personaggi sul client (significa che non elabora i personaggi in una nebbia di guerra sul client). Se si desidera prendere la selezione dei caratteri, la migliore decisione verrà inviata a tutti gli stati dei caratteri (con seed effettivi) dal server al client quando il client deve elaborare il carattere. Quindi, il server deve decidere quando il client deve elaborare il personaggio e quando non dovrebbe. Assicurati di usare generatori casuali separati per ogni personaggio.
  • Lo stesso problema si presenterà con le IA.
  • Il numero casuale da questo generatore casuale deve essere generato solo in aggiornamento con delta temporale fisso. Se si desidera utilizzare una cifra casuale per l'interpolazione AI prima del rendering, è necessario utilizzare un generatore casuale separato (non è presente alcun rendering sul server, quindi non importa quale seme verrà utilizzato).
  • Se si desidera utilizzare piattaforme diverse per client e server (ad esempio C ++ e Java), è necessario implementare (o trovare) un generatore casuale multipiattaforma. Non è un grosso problema, perché i generatori casuali sono facili da implementare.

3

Se sia il server che il client concordano sul seed, la maggior parte dell'algoritmo randomizzato produrrà gli stessi valori.

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.