Problem precyzji
Od samego początku zespół inżynierów wiedział, że ciągły świat będzie miał znaczący wpływ na konstrukcję silnika i treści, a głównym problemem była stabilność numeryczna. Wyobraź sobie dwie postacie idące w szyku dwa metry od siebie, zmierzające na wschód od miejsca pochodzenia. W pewnym momencie odległość od siebie jest przytłoczona odległością od źródła, a postacie wydają się znajdować „w tym samym miejscu”.
Dzięki zmiennoprzecinkowemu, im dalej od początku otrzymujesz, tym większą precyzję tracisz, co może powodować różnego rodzaju paskudne problemy. Rzeczy nie układają się dobrze, pojawiają się pęknięcia między sąsiednimi siatkami, przestrzeń zaczyna się kwantyzować, a koty i psy zaczynają żyć razem. Dungeon Siege używa FPU w trybie pojedynczej precyzji, aby uzyskać oczywiste korzyści w zakresie wydajności i dopasować się do natywnej precyzji sprzętu wideo. Jednak nawet jeśli zwiększymy precyzję, ostatecznie nigdy nie rozwiąże problemu, ponieważ planowano, że świat będzie niesamowicie duży.
Problem precyzji oznaczał, że nie byłoby możliwe zunifikowanie przestrzeni współrzędnych świata, jak w większości innych gier. Zamiast tego rozwiązaniem było podzielenie świata ciągłego na zestaw niezależnych przestrzeni współrzędnych i okresowe przełączanie między nimi w celu zresetowania precyzji. W ramach tych ograniczeń wypróbowano wiele pomysłów i ostatecznie zdecydowaliśmy się na odmianę standardowego systemu portalu.
Nasze rozwiązanie składa się z relacyjnego układu współrzędnych opartego na węzłach, w którym każdy fragment geometrii (węzeł oblężniczy) ma swoją własną przestrzeń współrzędnych i jest przestrzennie połączony z sąsiednią geometrią przez drzwi, które dzieli wspólnie z tymi sąsiadami. Układ węzłów połączonych drzwiami tworzy ciągły wykres reprezentujący całą mapę świata. Ten system węzłów ewoluował w czasie od pierwotnego celu, jakim jest utrzymanie precyzji FPU, aby stać się podstawową metodą efektywnego dzielenia przestrzeni i źródłem niezliczonych optymalizacji.
Aby zamknąć pojęcie pozycji 3D względem określonego węzła, tradycyjny wektor (x, y, z) musiał zostać uzupełniony o identyfikator węzła (x, y, z, węzeł) i reprezentować przesunięcie względem początku określonego węzła. Ten 4-krotek jest enkapsulowany jako pozycja węzła oblężniczego lub SiegePos. Później dodaliśmy SiegeRot (czwartorzęd, węzeł) w celu obsługi porównań między orientacjami w węzłach.
Wyrażenie „nie ma miejsca na świecie” stało się mantrą dla zespołu, chociaż dosłownie zajęło lata, aby wszyscy w pełni zrozumieli, co to znaczy.