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.
W wielkim świecie bez stref wybrałbym wierzchołek o podwójnej precyzji lub zmiennoprzecinkowy z mniejszymi fragmentami dzielącymi ziemię.
Każdy fragment miałby swój własny układ współrzędnych. Przekraczając granicę do każdej z tych części, przekształcasz wszystko w ten układ współrzędnych. I tak to robią w symulatorach lotów.
Jeśli masz małe strefy, myślę, że pływak wystarczy.
źródło
Powiedziałbym, że dla rzeczywistej lokalizacji jest to wektor 3 pływaków. Ale z graczem byłby również indeks strefy. (Ale nie jest częścią lokalizacji, ponieważ wszystko obsługiwane przez ten serwer strefy znajduje się w tej samej strefie, a zatem nie musi być w tej samej strukturze danych).
Pamiętaj, że istnieją co najmniej 4 strefy. 4 główne kontynenty. Nie sądzę, żeby któryś z nich miał z boku więcej niż 10 km. Na przykład ten blog przed najnowszym rozszerzeniem oblicza cały możliwy do podróży obszar jako 41 mil kwadratowych. Wszystkie pola bitew, wszystkie instancje, znajdują się w swoich strefach i koordynują również przestrzeń.
Za pomocą interfejsu API LUA można uzyskać pozycję odtwarzacza. GetPlayerMapPosition () zwraca dwa zmiennoprzecinkowe, każdy w proporcji od 0 do 1, na całej mapie świata.
źródło
W przypadku WoW oczekuję, że używają prostej liczby zmiennoprzecinkowej x / y / z - ale w odniesieniu do określonej „strefy”
Pomogłoby to obsłużyć „strefy ruchu”, na przykład łodzie i zeppeliny
źródło
Zwykle gry online, takie jak Wow, Tibia itp. Przechowuj odtwarzacz poz. przy użyciu trzech zmiennych X + Y + Z w meta tabeli odtwarzacza SQl. Runescape robi to bez Z - w ten sposób gracz jest zawsze renderowany na górze siatki ziemi.
źródło
Pływak? Cóż, zestaw 3 pływaków do gry 3D. Przynajmniej dla nas używamy stóp jako jednostek, więc wszystko, czego potrzebujesz, to 3-4 miejsca po przecinku, aby być w miejscu, w którym hałas nie jest problemem. Jeśli duża strefa ma tylko jedną lub dwie mile z boku, nie jest to wcale taka wielka sprawa. Co do przejrzystego podziału na strefy w MMO, to zupełnie inne pytanie. W wielkim schemacie trudnych problemów w MMO przechowywanie pozycji jest dość niskie na liście.
źródło