In quale tipo di tipo variabile è memorizzata la posizione del giocatore su un MMORPG come WoW?


18

Ho persino sentito J. Carmack parlarne rapidamente ...

In che modo un software può tracciare la posizione di un giocatore in modo così preciso, trovandosi in un mondo così vasto, senza caricare tra le zone e su una scala multiplayer? Come vengono formattati i dati quando passano attraverso il netcode?

Riesco a capire come i vertici sono memorizzati nella memoria della scheda grafica, ma quando si tratta di sincronizzare il multiplayer, non riesco a immaginare cosa sia meglio.

Risposte:


26

Scott Bilas ha lavorato a Dungeon Siege e ha scritto un articolo, "The Continuous World of Dungeon Siege" . Mentre Dungeon Siege non è un MMO, ha un mondo e parla del posizionamento del giocatore nel suo documento. Ho trovato un'ottima lettura. Ecco la sezione pertinente:

Il problema della precisione

Sin dall'inizio, il team di ingegneri sapeva che il mondo continuo avrebbe influenzato in modo significativo il motore e la progettazione dei contenuti e il problema principale era la stabilità numerica. Immagina due personaggi che camminano in formazione a due metri di distanza in direzione est dall'origine. Ad un certo punto, la distanza l'una dall'altra è sopraffatta dalla distanza dall'origine e i personaggi appariranno "nella stessa posizione".

Con la virgola mobile, più si ottiene dall'origine, più precisione si perde, il che può causare ogni tipo di brutto problema. Le cose non vanno bene, compaiono delle crepe tra le maglie adiacenti, lo spazio inizia a quantizzare e cani e gatti iniziano a vivere insieme. Dungeon Siege utilizza la FPU in modalità di precisione singola per ovvi vantaggi prestazionali e per abbinare la precisione nativa dell'hardware video. Tuttavia, anche se aumentassimo la precisione, alla fine non potrebbe mai risolvere il problema perché il mondo era pianificato per essere incredibilmente grande.

Il problema della precisione significava che non sarebbe stato possibile avere un mondo unificato per coordinare lo spazio come la maggior parte degli altri giochi. Invece, la soluzione era quella di segmentare il mondo continuo in un insieme di spazi di coordinate indipendenti e passare periodicamente da uno all'altro per ripristinare la precisione. All'interno di questi vincoli sono state provate varie idee e alla fine abbiamo optato per una variazione di un sistema portale standard.

La nostra soluzione consiste in un sistema di coordinate basato su nodi relazionali, in cui ogni blocco di geometria (Nodo d'assedio) ha il suo spazio di coordinate ed è collegato spazialmente alla geometria vicina tramite le porte che condivide in comune con quei vicini. La disposizione dei nodi collegati da porte forma un grafico continuo che rappresenta l'intera mappa del mondo. Questo sistema di nodi si è evoluto nel tempo dal suo obiettivo originale di mantenere la precisione FPU per diventare il metodo principale di suddivisione efficiente dello spazio e la radice di innumerevoli ottimizzazioni.

Per incapsulare il concetto di una posizione 3D rispetto a un nodo specifico, il vettore tradizionale (x, y, z) doveva essere aumentato con un ID nodo (x, y, z, nodo) e rappresentare un offset rispetto all'origine di un nodo specifico invece. Questa 4 tupla è incapsulata come Posizione nodo assedio o SiegePos. Successivamente, abbiamo aggiunto un SiegeRot (quaternione, nodo) al fine di gestire i confronti tra gli orientamenti tra i nodi.

La frase "non c'è spazio nel mondo" è diventata un mantra per il team, anche se ci sono voluti letteralmente anni per tutti per capire a fondo cosa significasse.

Puoi vedere altri suoi articoli su Dungeon Siege qui .


Questa sembra essere una risposta molto appiccicosa! Grazie ! Mi sarei chiesto se il gioco di oggi avrebbe usato numeri inerte come fanno gli interi di gmp.
jokoon,

3

Per un enorme mondo senza zone sceglierei un vertice a doppia precisione o un punto fluttuante con blocchi più piccoli che dividono la terra.

Ogni blocco avrebbe il proprio sistema di coordinate. Quando attraversi il bordo di ciascuno di questi blocchi, trasformerai tutto in quel sistema di coordinate. È così che lo fanno comunque in simulatore di volo.

Se hai piccole zone, immagino che il galleggiante sarà sufficiente.


La doppia precisione comporta rapidamente enormi vantaggi in termini di prestazioni e memoria. (x, y, z, zone) è 16 byte; (x, y, z) i doppi saranno almeno 24. Non puoi fare matematica veloce su di essi e non puoi usarli su una scheda grafica.

Bene, le carte Fermi possono usare la doppia precisione;) Ma sì, l'approccio a blocchi è ciò che la risposta suggerisce comunque.
Nailer,

2

Direi che per posizione reale è un vettore di 3 galleggianti. Ma ci sarebbe anche un indice di zona associato al giocatore. (Ma non fa parte della posizione perché tutto ciò che è gestito da quel server di zona è nella stessa zona e quindi non deve essere nella stessa struttura di dati.)

Ricorda che ci sono almeno 4 zone. I 4 continenti principali. Non credo che nessuno di questi sia più di circa 10 km da un lato. Ad esempio, questo blog prima dell'ultima espansione calcola l'intera area percorribile in viaggi come 41 miglia quadrate. Tutti i campi di battaglia, tutte le istanze, sono ciascuno con-nella propria zona e coordinano anche lo spazio.

Usando l'API LUA puoi ottenere la posizione del giocatore GetPlayerMapPosition () restituisce due float da 0 a 1 ciascuno in proporzione lungo l'intera mappa del mondo.


1

Per WoW, mi aspetto che utilizzino un semplice float x / y / z - ma rispetto a una 'zona' specifica

Ciò contribuirebbe a gestire le "zone in movimento", ad esempio barche e zeppelin


1

Di solito giochi online come Wow, Tibia ecc. Conservare il giocatore pos. usando tre variabili X + Y + Z nella meta tabella del giocatore SQl. Runescape lo fa senza la Z - in questo modo il giocatore viene sempre reso in cima alla parte superiore della maglia del terreno.


che cos'è una meta table? Dubito davvero che lo memorizzerebbe in un DB, deve essere usato in tempo reale ...
jokoon

(1) La meta tabella in quel caso è la tabella DB con i dati dei caratteri di base, ad es. Genere, posizione xyz, quantità di salute, contanti in banca ecc. E qualsiasi altra cosa ci possa essere. (2) Ho ospitato server Tibia aperti, in cui il lettore pos è memorizzato nella cache del server. Ma ... ogni 30 ~ s viene salvato un server sul e il POS del giocatore verrà aggiunto ai metadati del giocatore. Quindi, se il server viene arrestato / si blocca, la posizione dei giocatori tornerà alla posizione DB :)
Mikolaj Marcisz,

-2

Un galleggiante? Bene, una serie di 3 galleggianti per un gioco 3D. Almeno per noi usiamo i piedi come unità, quindi tutto ciò di cui hai bisogno sono 3-4 cifre decimali per essere nel punto in cui il rumore del galleggiante non è un problema. Se una grande zona è solo un miglio o due su un lato, non è un grosso problema. Per quanto riguarda la suddivisione in zone trasparente degli MMO, questa è una domanda completamente diversa. Nel grande schema dei problemi difficili in un MMO, la memorizzazione della posizione è piuttosto bassa nell'elenco.


Abbiamo avuto problemi di precisione in virgola mobile in alcune delle grandi zone STO durante lo sviluppo. Non so cosa ne sia stato di loro. Potrebbe non essere la massima priorità, ma deve essere considerata abbastanza presto per raggiungere effettivamente i livelli.
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.