Networking e movimento nell'UNITÀ di MMORPG


8

Sto programmando un server dedicato in C # usando le DLL BeamServer2. All'inizio volevo essere in grado di vedere gli altri giocatori muoversi sulla nostra mappa Omuni già creata. Questo l'ho fatto semplicemente inviando la tua posizione al server ogni frame. Questo ha funzionato e sono stato in grado di giocare con alcuni amici, ma il movimento non era lento. Così ho iniziato a provare ad aggiungere il livellamento dei movimenti e anche un po 'di sicurezza in modo che non possano semplicemente inviare una posizione falsa al server senza che il server gli impedisca di raggiungere gli altri client.

Quello che ho fatto, ho creato un masterClient con un controller di movimento sul telecomando. Quando un cliente vuole spostarsi, si sposta localmente e invia un messaggio al server con la sua direzione di spostamento. Il server quindi prende la sua velocità e la invia a masterClient. Il masterClient di sposta RemotePlayer proprio come si sposta da solo RemotePlayer. Quando smette di muoversi, invia un messaggio con la sua posizione. Il client principale verifica che la posizione in cui è arrivato sia vicina alla posizione che ha dal client, se è realistico in base al ping del client, il server lo mette nella posizione del client.

Funziona, ma ho ancora un problema di ritardo e non sono sicuro di come risolverlo. Devo rendere il movimento più fluido sul client, ma mi sono reso conto che posso semplicemente spostare (x / 2, y / 2, z / 2) nella posizione e metterlo nella posizione reale del fotogramma successivo, non ci sono riuscito e io ci riproverò presto. Anche se questo viene aggiunto, non sono sicuro che il ritardo sia corretto.

Altre tecniche, suggerimenti, domande, ...? Grazie, Diede.

Risposte:


8

Ci sono molti problemi / compiti coinvolti nella programmazione di giochi di rete in tempo reale "senza ritardi".

  • velocità hardware (potenza CPU necessaria per lettore sia client che server)
  • distanza di rete e apparecchiature (connessione LAN o WAN?)
  • larghezza di banda del server (quanti giocatori)

In secondo luogo hai i "cattivi" che cercano sempre di imbrogliare nei giochi. Se il tuo gioco diventa pubblico, considera cosa succederebbe se mi sedessi e iniettassi pacchetti di rete "falsi". Considera se qualcuno ha pubblicato "posizioni irraggiungibili" o "salute / munizioni complete".

Il mio suggerimento per la tua architettura per iniziare, sarebbe qualcosa del genere:

  • Server, controlla tutti i dati vitali, calcola E convalida il movimento.
  • Cliente, riceve i dati su cosa mostrare sullo schermo + alcuni dati "pensa al futuro" sugli oggetti in movimento.

La maggior parte degli FPS in tempo reale, come so, fa una sorta di "sappiamo che stai andando in questa direzione a questa velocità, quindi lo simuliamo fino a quando non avremo altri dettagli dal server"

Quindi il tuo client dovrebbe pubblicare "ciò che richiede" e potrebbe persino iniziare a spostarsi in quella direzione, ma potrebbe essere "forzato" dal server se il server rifiuta il movimento. Qui devi pensare, cosa succede se il client pubblica "false coord" al di fuori della mappa, o "salti" di conseguenza. Il server deve tracciare se la nuova posizione è possibile dal suo punto precedente OPPURE il server riceve solo il messaggio che dice: "CLIENT MOVE FORWARD 200" e quindi il server elabora ciò che farà in base alla mappa e ai dati di gioco.

Questo darà un po 'di ritardo, ma ancora una volta, se lasci che il client riceva questi dati e faccia un po' di matematica da solo, non ha bisogno di un aggiornamento ogni ms / frame, può ritardare un po 'senza un notevole ritardo sullo schermo.

Forse puoi persino dividere la mappa in "tessere virtuali" (se è un gioco vettoriale) in modo da avere un modo rapido per calcolare dove dovrebbero essere gli oggetti successivi.

World of Warcraft / Battlefield / Counterstrike

Credo che anche WOW lo stia facendo in questo modo. Premi un tasto, il server riceve il tuo movimento "desiderio" e rispondi con "ti stai spostando ora" e quindi il client mostra questo + il server simula la nuova posizione sul server in una sorta di "sessione pr. Client". Questo è dove il "massimo numero di giocatori per gioco" sta diventando brutto, perché il tuo server deve tenere traccia di tutti e fondamentalmente farlo come "a turni" - ma così in fretta che sembra in tempo reale.

Così...

Foreach (Client in GameSessionList)
{
   ParseInput();
   ParseMovement(); // including collission test
   ResponseSend(); // new positions+movement data for client and objects/other players
}

3
Indipendentemente dal merito della sua risposta, c'è qualche motivo per essere scortese?
Konrad,

Ho avuto l'impressione che nella maggior parte dei giochi FPS, i client e il server si scontrino in modo indipendente, e il server corregge i client se variano troppo, piuttosto che i client che simulano.
Magus,

Non sono a conoscenza di come lo faccia ogni FPS. Ma sì, ad es. la serie BF ha qualcosa che chiamano Netcode, il che significa che eseguono i calcoli localmente e inoltrano i risultati al server che quindi verifica e distribuisce i risultati (come da quello che mi è stato detto). Questo potrebbe avere a che fare con la loro enorme quantità di "particelle" / dettagli che devono essere trasferiti altrimenti. Dove come WOW è un mondo più statico e non hai collisioni tra personaggi (in modalità normale), quindi va bene lasciarti "scorrere" attraverso qualcun altro.
BerggreenDK

2

La parte difficile della compensazione dei ritardi è che riceverai aggiornamenti da client fuori servizio. Il comando di un client ritardato inviato al momento T può benissimo arrivare dopo un comando client non ritardato inviato a T + 40ms. Applicare i comandi nell'ordine in cui li ottieni porterà a tutti i tipi di cattiveria. Farlo correttamente comporta invece il riavvolgimento del tempo e la riproduzione di tutti i comandi che sono stati emessi da allora.

Non esiste un modo semplice per aggirare questo, ma ci sono più soluzioni valide. Puoi trovarne uno relativamente semplice descritto qui .

Ci sono molte ricerche in questo campo, date un'occhiata in giro!


1

Creerei il client come se fosse un gioco non di rete. Cioè, qualsiasi cosa tu faccia, lo fai immensamente sul client. Quindi aggiungi, parallelamente a questo, il tuo codice di rete. Questo codice otterrà i dati di movimento. Semplice come da corde, direzione e velocità. Invia semplicemente questo al server che convalida. Il server ti invia un ok o una nuova posizione.

Quindi hai tutto il tuo codice client in esecuzione come se fosse solo al mondo. Quindi riceve semplicemente i nuovi dati di correzione dal server o un ok. Se premi in avanti e tieni premuto per dieci secondi, il server riceverà solo quei dati. Potresti concedere l'invio / la ricezione di dati ogni secondo anche se stai semplicemente tenendo premuto il pulsante Avanti, oppure, se colpisci un picco, potresti correre per sempre.

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.