Jak przechowywać globalne dane kontekstowe w systemie komponentu encji?

10

Moje pytanie brzmi:

Jak przechowywać globalne dane kontekstowe, tj. informacje o danych na świecie, aktualny czas na świecie itp. w systemie elementów encji?

Myślę o pracy nad stworzeniem otwartej gry symulacyjnej Dwarf Fortress w C ++. Stworzyłem silnik gry w stylu komponentu bytu dla zabawy i obecnie próbuję dowiedzieć się, jak zamierzam działać we wszystkich wymaganych funkcjach. Oprócz standardowej rozgrywki (rendering, fizyka, dane komponentów specyficzne dla bytu, itp.) Chciałbym również mieć pewne globalne dane kontekstowe, do których miałyby dostęp wszystkie odpowiednie systemy (tj. Dane światowe, takie jak rok, w którym są obecnie , czy ma miejsce globalne ocieplenie, Wszelkie rzeczy, które byłyby istotne dla symulacji świata). Początkowo myślałem o stworzeniu komponentu „światowego”, ale wydaje się to bezcelowe i trudne, jeśli wiele różnych systemów potrzebuje dostępu do tych logicznie „globalnych” danych.

Czy sensowne byłoby posiadanie komponentu „światowego”, czy też powinienem przechowywać te dane w inny sposób?

Zastanawiałem się także nad tym, aby te dane były globalne, a tym samym umożliwiałyby dostęp do systemów, które chciałyby z nich korzystać; wydaje się, że jest to naruszenie zasad składowych bytu w ogóle i być może bałagan z innych powodów, ale pomyślałem, że to może naprawdę zadziałać.

Inną rzeczą, o której myślałem, byłoby osadzenie odpowiednich danych kontekstu światowego bezpośrednio w samych systemach. Na przykład, gdybym miał AgeSystem„starzejące się” wszystkie byty, które mają getsWeakerAsTimePassesskładnik lub coś w tym stylu, to może ten system mógłby przechowywać odpowiednie dane dotyczące czasu dla świata bezpośrednio jako dane członka, których użyłby do obliczenia upływu czasu i ile starzeć się i osłabiać ludzi itp. Trzecia opcja była moją najmniej ulubioną, ale coś, co przyszło mi do głowy podczas burzy mózgów.

Czy ktoś może doradzić?

Awesomania
źródło
3
Uzasadnienie dla głosów negatywnych jest grzeczne i przydatne nie tylko OP, ale także innym użytkownikom.
MichaelHouse
2
Zbudowałeś młotek, a teraz wszystko wygląda jak gwóźdź. Daję ci pozwolenie na używanie więcej niż tylko ECS do przechowywania i manipulowania danymi w twoim programie, ponieważ nie wszystko jest gwoździem.
Patrick Hughes,

Odpowiedzi:

10

Każdy sposób, który działa, to sposób, który działa. Brzmi dziwnie, ale tak naprawdę twoja gra jest 1000 razy ważniejsza niż architektura. Wybierz dowolne podejście i wybierz łatwą w użyciu.

Te, które widziałem w rzeczywistych grach wysyłkowych (wykorzystujących projektowanie oparte na komponentach, a nie ECS; nigdy nie widziałem czystego ECS „na wolności”, chociaż wiele projektów komponentów ma do nich elementy podobne do ECS):

  • Singletony
  • Obiekty „kontekstowe” przekazywane do komponentów / systemów, które zawierają odniesienia do wszystkich odpowiednich innych systemów
  • Fabryki komponentów, które przekazują uchwyty systemowe do poszczególnych komponentów
  • Komponenty przechowujące odniesienia do systemów w katalogu głównym hierarchii obiektów (tylko w niektórych dziwnych grach Unity)
  • Pojedyncze obiekty „silnika” przekazywane do systemów lub komponentów, które zawierają odniesienia do wszystkich innych systemów
  • Systemy wyszukiwania zasobów oparte na łańcuchach znaków (pozwalające Ci w C ++ zrobić coś takiego handle<PhysicsSystem> = GetResource<PhysicsSystem>("/systems/physics"), tak, naprawdę)
  • Stosy globalnych danych i działające na nich bezpłatne funkcje w stylu C.
  • Przestrzenie / podprzestrzenie i towarzyszące wideo

Wszystkie działają. Mam obsesję na punkcie niektórych podejść i oczywistego faworyta, ale wszystkie były używane do wysyłania gier AAA. Czasami wiele podejść w jednym projekcie (40-100 + zespołów inżynierów ma tendencję do tworzenia przypadkowego duplikatu kodu, niestety).

Sean Middleditch
źródło
2
Jestem ciekawy, kto jest twoim ulubionym.
ashes999
Łącza, które podałem, są do moich slajdów i wideo mojego wykładu na ten temat, jeśli to jakaś wskazówka. :)
Sean Middleditch
Ach, więc twoje ulubione to spacje / podprzestrzenie . :)
ashes999
Świetna odpowiedź. Wydaje mi się, że coś mi się udało. W rzeczywistości wprowadziłem koncepcję „przestrzeni / podprzestrzeni” do mojej gry.
Awesomania,