Come devo tenere traccia delle posizioni in tempo reale dei giocatori in un MMO?


14

Come tenere traccia delle posizioni dei giocatori in un MMORPG? Ho letto che è possibile utilizzare un database o è possibile memorizzare le coordinate in file. Ho provato a utilizzare un database ma è stato lento. Come possono essere utilizzati i file per tenere traccia delle posizioni dei giocatori?

Risposte:


23

How can files be used to keep track of players positions?

Scrivi la posizione del giocatore nel file. Ad esempio, se identifichi ogni giocatore con un numero univoco (o un GUID), puoi usarlo come nome del file. Nel file, scrivi semplicemente i dati di posizione in un formato che puoi analizzare in seguito. Ad esempio, 467239.txtpotrebbe contenere 20, 3, 19se il giocatore # 467239 è in quel (x, y, z) location.

Questo non è così diverso da quello che faresti con un database, tuttavia - un database non dovrebbe essere "lento" in questa operazione, dovrebbe essere molto veloce (probabilmente più veloce dei file, perché hai più overhead IO del disco o blocco IO contesa - se sono state memorizzate più posizioni per file - in un approccio basato sul filesystem).

Forse stavi cercando di utilizzare il DB o il filesystem per memorizzare la posizione del player in fase di esecuzione ? Non dovresti farlo affatto .

In fase di esecuzione, nel tuo server, le posizioni dei giocatori dovrebbero essere mantenute in memoria e aggiornate lì, come faresti con qualsiasi altro tipo di gioco. Periodicamente possono essere salvati su disco o altro archivio permanente, ad esempio quando il lettore si riposa, salva o si disconnette.

Ma scrivere ogni posizione dei giocatori nella memoria di ogni aggiornamento è superfluo ed estremamente inefficiente; non sarà mai abbastanza veloce da gestire qualcosa che assomigli a "massicce" scale di giocatori.


1
Sì, in realtà stavo salvando la posizione del giocatore su un postgreSQL in fase di esecuzione. Ma se lo tengo nella memoria del server come posso aggiornare la posizione nei client?
Baccari,

12
Il metodo con cui il client viene aggiornato è lo stesso in tutti i casi: il server dice al client quale sia la sua posizione tramite un messaggio di rete (o più realisticamente, il client, che sta eseguendo una previsione locale, ha anche una posizione locale che il server convalida e conferma per il client). Non è necessario che il client acceda al database a cui accede il server.

1
Mi manca il punto di dire "fallo con un file", solo per spiegare che in realtà è peggio che usare il db e poi spiegare qual è il vero problema. Perché hai bisogno di quella spiegazione di file inutili in primo luogo? Confonde solo il lettore occasionale, senza alcun vantaggio per nessuno.
o0 '.

6
In passato ho sperimentato che ignorando le domande dirette e semplicemente procedendo a lezioni su ciò che penso "il modo giusto" dovrebbe essere più conflittuale e rende l'OP meno recettivo a essere guidato lontano dalle fondamenta più deboli, la loro domanda originale è proveniente da tutto qui.

13

La posizione deve essere nella RAM mentre è in uso. (es: il personaggio del giocatore è nel mondo) Non è possibile utilizzare il DB come memoria operativa. Bene, puoi, ma sarà terribile.

Dovresti salvare le posizioni regolarmente, ma non ogni volta che cambiano.

Eviterei anche di salvare tutte le posizioni contemporaneamente. Se vuoi mantenere la persistenza in caso di crash del server, dovresti salvare la posizione il più spesso possibile, ma nel tempo libero del gioco. Basta farlo per lotti.

Risparmia 30 posizioni mentre è disponibile tempo libero.

Per quanto riguarda i clienti. Dovrebbero ricevere aggiornamenti (pertinenti) sullo stato del gioco tramite una connessione al software del server. Non dal DB ... Sarebbe poco pratico, lento, cattivo, cattivo e la forza sarebbe disturbata.


2
E sì, usa un thread separato per evitare situazioni in cui il database potrebbe bloccare il resto del tuo ciclo di gioco.
Coyote,

4

Ho un thread separato in cui faccio la coda per salvare i file ogni 500 tick circa. Altrimenti, dovresti archiviare tutto nella RAM.


4

Quello che faccio nel mio server è memorizzare la direzione (vettore) e l'ultima posizione dei giocatori, se il giocatore ha una velocità, faccio calcolare la nuova posizione dei giocatori ogni 2 secondi.

Il client ha ovviamente la sua posizione di posizione e invia la sua nuova direzione (vettore) al server.

Il server è autorevole riguardo alla posizione e invia un pacchetto di posizione se il client si è spostato di una certa distanza dall'ultimo controllo (ciò può portare all'effetto elastico se il client non è sincronizzato).

Tutto ciò accade ovviamente in memoria.

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.