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.