In welcher Art von Variablentyp ist die Spielerposition in einem MMORPG wie WoW gespeichert?

18

Ich habe sogar J. Carmack schnell darüber reden hören ...

Wie kann eine Software die Position eines Spielers in einer so riesigen Welt so genau verfolgen, ohne zwischen Zonen zu wechseln und im Multiplayer-Modus? Wie werden die Daten formatiert, wenn sie den Netcode durchlaufen?

Ich kann verstehen, wie Scheitelpunkte im Speicher der Grafikkarte gespeichert werden, aber wenn es um die Synchronisierung des Multiplayers geht, kann ich mir nicht vorstellen, was das Beste ist.

jokoon
quelle

Antworten:

26

Scott Bilas arbeitete an Dungeon Siege und schrieb eine Arbeit mit dem Titel "The Continuous World of Dungeon Siege" . Während Dungeon Siege kein MMO ist, hat es eine Welt und er spricht über die Positionierung der Spieler in seiner Zeitung. Ich fand es eine großartige Lektüre. Hier ist der relevante Abschnitt:

Das Präzisionsproblem

Von Anfang an wusste das Engineering-Team, dass die kontinuierliche Welt die Engine und das Content-Design erheblich beeinflussen würde, und das Kernproblem war die numerische Stabilität. Stellen Sie sich zwei Charaktere vor, die in zwei Metern Entfernung in östlicher Richtung vom Ursprung in Formation gehen. Irgendwann wird die Entfernung voneinander durch die Entfernung vom Ursprung überfordert, und die Zeichen scheinen sich „am selben Ort“ zu befinden.

Je weiter Sie mit dem Gleitkomma vom Ursprung entfernt sind, desto mehr Präzision verlieren Sie, was zu allen möglichen unangenehmen Problemen führen kann. Dinge sortieren nicht richtig, Risse erscheinen zwischen benachbarten Maschen, der Raum beginnt sich zu quantifizieren und Katzen und Hunde beginnen zusammen zu leben. Dungeon Siege verwendet die FPU im Einzelgenauigkeitsmodus, um die offensichtlichen Leistungsvorteile zu erzielen und die native Präzision der Videohardware zu erreichen. Aber selbst wenn wir die Präzision erhöhen würden, könnte dies das Problem letztendlich nie lösen, da die Welt unglaublich groß sein sollte und am Ende unglaublich groß sein sollte.

Aufgrund des Präzisionsproblems wäre es nicht möglich, wie bei den meisten anderen Spielen einen einheitlichen Weltkoordinatenraum zu haben. Stattdessen bestand die Lösung darin, die kontinuierliche Welt in eine Reihe unabhängiger Koordinatenräume zu unterteilen und regelmäßig zwischen diesen zu wechseln, um die Genauigkeit zurückzusetzen. Innerhalb dieser Einschränkungen wurden verschiedene Ideen ausprobiert, und wir entschieden uns schließlich für eine Variante eines Standardportalsystems.

Unsere Lösung besteht aus einem relationalen knotenbasierten Koordinatensystem, in dem jeder Geometrieblock (Siege Node) einen eigenen Koordinatenraum hat und über die Türen, die er mit diesen Nachbarn teilt, räumlich mit der benachbarten Geometrie verbunden ist. Die Anordnung der durch Türen verbundenen Knoten bildet einen durchgehenden Graphen, der die gesamte Weltkarte darstellt. Dieses Knotensystem entwickelte sich im Laufe der Zeit von seinem ursprünglichen Ziel, die FPU-Präzision beizubehalten, zur primären Methode zur effizienten Unterteilung des Raums und zur Wurzel unzähliger Optimierungen.

Um das Konzept einer 3D-Position in Bezug auf einen bestimmten Knoten einzukapseln, musste der herkömmliche Vektor (x, y, z) mit einer Knoten-ID (x, y, z, node) erweitert werden und einen Versatz zum Ursprung darstellen eines bestimmten Knotens statt. Dieses 4-Tupel ist als Belagerungsknotenposition oder SiegePos eingekapselt. Später haben wir ein SiegeRot (Quaternion, Node) hinzugefügt, um Vergleiche zwischen Ausrichtungen über Nodes hinweg zu ermöglichen.

Der Satz „Es gibt keinen Weltraum“ wurde für das Team zum Mantra, obwohl es buchstäblich Jahre dauerte, bis alle verstanden, was es bedeutete.

Weitere Artikel über Dungeon Siege finden Sie hier .

Ricket
quelle
Das scheint eine sehr gute Antwort zu sein! Vielen Dank ! Ich hätte mich gefragt, ob das heutige Spiel limbed numbers verwenden würde, wie es die Ganzzahlen von gmp tun.
jokoon
3

Für eine riesige zonenlose Welt würde ich entweder einen Vertex mit doppelter Genauigkeit oder einen Gleitkommawert mit kleineren Teilen wählen, die das Land teilen.

Jeder Chunk hätte ein eigenes Koordinatensystem. Wenn Sie die Grenze zu jedem dieser Abschnitte überschreiten, transformieren Sie alles in dieses Koordinatensystem. So machen sie es sowieso in Flugsimulationen.

Wenn Sie kleine Zonen haben, wird Float wahrscheinlich ausreichen.

Nagler
quelle
Doppelte Präzision bringt schnell enorme Leistungs- und Speichervorteile mit sich. (x, y, z, zone) ist 16 Bytes; (x, y, z) Doppel werden mindestens 24 sein. Sie können nicht schnell rechnen und Sie können sie nicht auf einer Grafikkarte verwenden.
Nun, Fermi-Karten können doppelte Präzision verwenden;) Aber ja, der blockierte Ansatz ist das, was die Antwort sowieso vorschlägt.
Nagler
2

Ich würde sagen, dass es für die tatsächliche Position ein Vektor von 3 Floats ist. Es gibt aber auch einen Zonenindex, der dem Spieler zugeordnet ist. (Aber nicht Teil des Speicherorts, da sich alle von diesem Zonenserver gehandhabten Daten in derselben Zone befinden und daher nicht in derselben Datenstruktur sein müssen.)

Denken Sie daran, dass es mindestens 4 Zonen gibt. Die 4 Hauptkontinente. Ich glaube nicht, dass einer von denen mehr als 10 km auf einer Seite ist. In diesem Blog vor der letzten Erweiterung wird beispielsweise die gesamte reisefähige Fläche mit 41 Quadratmeilen berechnet. Alle Schlachtfelder, alle Instanzen sind jeweils in ihrer eigenen Zone und koordinieren auch den Raum.

Mit der LUA-API können Sie die Position des Players ermitteln. GetPlayerMapPosition () gibt zwei Gleitkommazahlen von 0 bis 1 als Proportionen entlang der gesamten Weltkarte zurück.

Doug-W
quelle
1

Für WoW erwarte ich, dass sie ein einfaches float x / y / z verwenden - aber relativ zu einer bestimmten 'Zone'

Dies würde helfen, sich bewegende Zonen wie Boote und Zeppeline zu handhaben

Bluescrn
quelle
1

In der Regel Online-Spiele wie Wow, Tibia usw. Speichern Sie den Spieler pos. mit drei Variablen X + Y + Z in der SQl-Player-Metatabelle. Runescape verzichtet auf das Z - so wird der Spieler immer oben auf dem Bodennetz dargestellt.

Mikolaj Marcisz
quelle
Was ist eine Metatabelle? Ich bezweifle wirklich, dass es in einer DB gespeichert wird, es muss in Echtzeit verwendet werden ...
jokoon
(1) Die Metatabelle ist in diesem Fall die DB-Tabelle mit den Grundzeichendaten, z. Geschlecht, Position xyz, Gesundheitszustand, Bankeinzug usw. und was auch immer vorhanden sein mag. (2) Ich habe offene Tibia-Server gehostet, in denen die Player-Position im Server-Cache gespeichert ist. Aber ... alle 30 ~ s gibt es einen Server, auf dem gespeichert wird, und der POS des Spielers wird zu den Metadaten des Spielers hinzugefügt. Wenn der Server heruntergefahren wird oder abstürzt, kehrt die Position des Spielers in die Position DB zurück :)
Mikolaj Marcisz
-2

Ein Schwimmer? Nun, ein Array von 3 Floats für ein 3D-Spiel. Zumindest für uns verwenden wir Füße als Maßeinheiten, sodass Sie nur 3-4 Dezimalstellen benötigen, um an dem Punkt zu sein, an dem Schwebegeräusche kein Problem darstellen. Wenn eine große Zone nur ein oder zwei Kilometer von einer Seite entfernt ist, ist das keine große Sache. Was die transparente Zonierung in MMOs betrifft, ist das eine ganz andere Frage. In dem großen Schema schwieriger Probleme in einem MMO ist das Speichern von Positionen ziemlich weit unten auf der Liste.

coderanger
quelle
In einigen der großen STO-Zonen hatten wir während der Entwicklung Probleme mit der Gleitkommapräzision. Ich weiß nicht, was aus ihnen geworden ist. Es mag nicht die höchste Priorität sein, aber es muss früh genug in Betracht gezogen werden, um tatsächlich Level zu schaffen.