System budowania to jeden z najczęściej używanych mechanizmów w Pax Dei. W związku z tym postanowiono podzielić się większą ilością informacji na temat technologii stojącej za tym systemem – jednym z najbardziej skomplikowanych w historii gier wideo.

Obecnie w najczęściej zaludnionych dolinach domowych znajduje się około 400 000 elementów budynków. Z 24 dolinami domowymi na świat, daje to miliony elementów na każdym świecie. Średni przyrost wynosi 10 000 nowych elementów tygodniowo w jednej dolinie.

Pax Dei - budynek nad wodą

System replikacji

W sieciowej grze wieloosobowej system replikacji jest używany, aby zapewnić wszystkim graczom spójny i aktualny stan gry. Innymi słowy, system otrzymuje dane wejściowe od gracza i przekazuje je innym graczom.

Obecnie rozmiar danych budynkowych dla jednej doliny domowej wynosi około 30 MB. Nie brzmi to jak dużo, prawda? Ale załóżmy, że jest 100 graczy – teraz mówimy o 3 GB danych, które muszą być zarządzane przez serwer, klienta (komputer gracza) i system replikacji.

Ta ilość danych jest tak ogromna, że wymaga specjalnego traktowania na każdym etapie pipeline'u gry. Jeśli używane jest Unreal Engine do replikacji rozgrywki, nie można go użyć do replikacji budynków. Szkieletem systemu replikacji budynków jest serwer backendowy Repli, który przesyła dane budowlane z bazy danych świata do klientów i serwerów.

Podczas logowania zarówno klient, jak i serwer łączą się z Repli, które wysyła aktualny stan strefy. Jak wspomniano, dane początkowe wynoszą około 30 MB w największych strefach. Po początkowej replikacji stanu, klient i serwer nasłuchują nowych zdarzeń budowy z Repli. Używany jest streaming gRPC jako kanał komunikacyjny do budowy zdarzeń z Repli. Nie zagłębiając się w szczegóły, gRPC zapewnia prawidłową komunikację pomiędzy serwerem, Repli i klientami.

Dodawanie elementu budynku: pod maską

Oto co dzieje się po tym, jak gracz uderza młotkiem konstrukcyjnym:

  1. Klient wysyła żądanie budowy do serwera Unreal;
  2. Serwer przeprowadza kontrolę uprawnień, aby zweryfikować, czy żądanie budowy jest dozwolone;
  3. Jeśli serwer to zatwierdzi, wysyła żądanie do backendu;
  4. Backend wykonuje własne kontrole, aby zaakceptować lub odrzucić żądanie budowy;
  5. Po akceptacji, element budynku zostaje dodany do głównej bazy danych świata;
  6. Zdarzenie budowy zostaje wysłane z bazy danych do serwera backendowego Repli;
  7. Repli przesyła zdarzenie budowy zarówno do serwera, jak i klienta;
  8. Serwer i wszyscy klienci w strefie – tutaj Dolinie Domowej – generują nowy element budynku;
  9. Serwer przeprowadza kontrolę integralności struktury;
  10. Klient oblicza integralność, aby wyświetlić ją w interfejsie użytkownika.

Sprawienie, by budynek był widoczny dla wszystkich

Masowa replikacja danych to tylko jedno z wielu wyzwań. Po pobraniu wszystkich 400 000 elementów doliny domowej, czyli omawianych 30 MB danych, trzeba sprawić, by były one widoczne. Komputer musi je narysować, a to drugie duże wyzwanie.

Nie byłoby możliwe użycie systemu, który rysuje 400 000 elementów jeden po drugim. Potrzebne są narzędzia dopasowane do potrzeb. Kluczowymi elementami, które się używa, są instancjonowane siatki statyczne (ISM) i menedżerowie obszarów.

ISM pozwalają na rysowanie wielu, nawet tysięcy, elementów w jednym wywołaniu, zamiast rysować je pojedynczo. Menedżerowie obszarów, prostopadłościenne pudełka widoczne na poniższym filmie, kontrolują wszystkie elementy budynków i dekoracje w swoich obszarach. Zarządzają tworzeniem i niszczeniem elementów, obliczeniami integralności i innymi zadaniami, w tym ISM.

Menedżerowie obszarów przyglądają się wszystkim standardowym elementom budynków w swoich obszarach – nie obejmują one rzemieślników ani pojemników – i sortują je przestrzennie. Następnie umieszczają je w niestandardowych ISM. I tutaj zaczyna się magia.

Nie tylko budynki muszą być rysowane. Pojemniki, rzemieślnicy i dekoracje również wymagają renderowania, a większość z nich ma swoją własną funkcjonalność rozgrywki. Wszystkie te elementy są standardowymi aktorami Unreal, ale w przeciwieństwie do budynków, które można zobaczyć z daleka, pojawiają się one tylko wokół postaci w granicach dystansu strumieniowania.

Na filmie widać, jak menedżerowie obszarów działają i jak elementy dekoracyjne stają się widoczne lub nie. Każde pole to menedżer obszarów, który kontroluje widoczność rekwizytów, takich jak rzemieślnicy, pojemniki i inne dekoracje. W zależności od pozycji postaci i dystansu strumieniowania klienta, menedżer aktywuje lub dezaktywuje widoczność wszystkich aktorów.

Na filmie czerwony oznacza menedżerów, którzy dezaktywują widoczność rekwizytów, cyjan – tych, którzy aktywują, fioletowy – tych, którzy są w trakcie aktywacji, a magenta – tych, którzy są w trakcie dezaktywacji.

Specjalne traktowanie dla źródeł światła

Inny rodzaj rekwizytów, który wymaga specjalnego traktowania, to źródła światła. Kiedy postać zbliża się do nich, światła działają przez system Unreal Lumen – dynamiczny system globalnej iluminacji Unreal Engine 5, aby zwiększyć immersję. Jednakże, gdy postać się oddala, światła są zastępowane lekkimi kartami świetlnymi, aby poprawić wydajność. W niektórych dolinach można jednocześnie zobaczyć ponad 20 000 źródeł światła!

Oczywiście istnieją też pewne ograniczenia po stronie serwera. Jeden serwer Unreal Engine może obsłużyć maksymalnie 150-200 graczy. Jeśli więcej graczy chce być w tej samej wiosce, potrzebne są instancje serwerów. System replikacji umożliwia widoczność budynków we wszystkich instancjach serwera w czasie rzeczywistym! Jeśli jeden gracz coś buduje w jednej instancji serwera, wszyscy gracze w innych instancjach widzą te zmiany w czasie rzeczywistym.

Miasto nocą w Pax Dei

Kilka ostatnich słów

Generowanie wszystkich tych elementów budynków wokół postaci bez widocznych opóźnień jest skomplikowane i zajmuje kilka sekund, a czasem minut, rozłożonych na wiele klatek. Jak można się domyślać, obliczenia integralności struktury to bardzo złożony proces. Serwery również przesyłają zawartość świata, więc obliczenia integralności muszą być starannie zaplanowane, aby wszystkie wspierające elementy były obecne, zanim zaczną się obliczenia. Tworzenie stanów fizycznych musi odbywać się bez opóźnień, a później zapytania dotyczące fizyki i rzeczywiste obliczenia integralności muszą być przeprowadzane iteracyjnie.

Dlatego przy logowaniu często najpierw widać krajobraz, potem budynki, a na końcu dekoracje.

Gracze budują znacznie szybciej, niż początkowo zakładano. System przeszedł wiele optymalizacji, ale wciąż jest wiele możliwości ulepszeń. Obecny system powinien działać bezproblemowo do około 500 000 elementów. Po przekroczeniu tej liczby pojawią się nowe wyzwania. Dobrą wiadomością jest to, że istnieją plany skalowania systemu do 1 000 000 elementów na strefę. Ale to historia na inny czas.