Przejdź do treści
Tomasz Wyderka Tomasz Wyderka
PL / EN
Powrót do postów

SimSandbox – własny silnik symulacji w .NET 8

Buduję od zera silnik symulacji inspirowany Songs of Syx: własny ECS w 200 liniach, wielowątkowa architektura, AI agentów i deterministyczna pętla — wszystko w C# i MonoGame.

.NET C# ECS Symulacja Game Dev MonoGame

Dlaczego Songs of Syx?

Miłosna miłość do gier symulacyjnych sięga lat 90. W 2004 roku powstała Songs of Syx – izometryczna gra symulacyjna o żywej osadzie, gdzie każdy agent ma własne potrzeby, umiejętności i zachowania. Emigranci chodzą do pracy jako farmerzy, zbieractwo surowców, budują budynki – a całość działa na prostych zasadach, które generują emergencję.

Gra była tak dobra, że jej źródła nigdy nie zostały opublikowane. A to mnie nie puszczało z głowy przez lata.

Czego się uczę

SimSandbox to nie jest gra w rozumieniu tradycyjnym. To laboratorium architektury silnika symulacyjnego, zbudowane od zera w .NET 8. Każda decyzja jest świadoma i celowana:

  • Zrozumiem jak zbudować ECS (Entity Component System) bez zewnętrznych zależności
  • Nauczę się wielowątkowej symulacji – oddzielenie logicznego ticka renderowania
  • Przetestuję deterministyczne pętle sima – fixed timestep, double-buffered snapshots
  • Poznam AI agentów – FSM, pathfindig A*, resource gathering, ekonomia

Stack

  • .NET 8 + MonoGame 3.8 – render na 60-144 Hz
  • MemoryPack – szybka binarna serializacja przez source generators
  • Własny bitset ECS – ~200 linii, zero zewnętrznym bibliotekom
  • A* z .NET 6+ PriorityQueue + cache ścieżek w komponencie ECS

Jak to działa

Kluczowa architektura sima: dwa wątki.

┌─────┐     snapshot     ┌─────────┐
│Render│─────────────────▶│    Sim  │
│60-144HZ│                │30 Hz tick│
└─────┘                  └─────────┘
  ▲                           │
  │ reads                    ┌┴────┐
  └──── snapshot ─────────────World│
                       │ECS + Map│
                       │+AI     │
                       └───────┘

Sim tickuje deterministycznie co 30 Hz na wątku w tle. Render czytuje double-buffered snapshot atomowo pod lockiem – nie blokuję nigdy sima dla renderowania. Resultat? Płynna animacja nawet przy zmiennym FPS.

Co już działa

Prawie rok prac i mam działanie:

ECS – tworzenie/zniszczanie entity, zapytania z 1-4 komponentami, generation counters dla bezpieczeństwa pamięci.

Mapa i pathfindig – proceduralnie generowany świat (4 typy tile’ów: trawa, podłoga, ściana, drzwi). A* z zakazem „corner cutting” – agenci nie przeszukują przez ściany. Path cache w komponencie ECS = A* wylicza się raz, agent porusza się po zapamiętanej ścieżce.

Agenci – spawnowani w domach, z podstawowym statusem głodu. Wędrują z bias 70% dom / 30% mapa. Gdy głodują – idą do magazynu, jedzą, wracają do domu.

Ekonomia – farmerzy automatycznie produkują żywność (IdzieDoPracy → Pracuje → DostarczaDoMagazynu). Magazyn ma pojemność 50/100.

Budowanie – domy 4×4, magazyny 6×6 z niebieskimi drzwiami, farmy 4×4 z zielonym wnętrzem. System planowania budowy i auto-place gdy teren jest wolny.

Save/load – binarny format MemoryPacka, wersjonowanie od dnia 1 (już 5 wersji pliku). Migracje między wersjami – wpisz to teraz, bo za 3 miesiące będziesz dziękował.

Co jeszcze nie działa

  • Multithreading w AI – fase logiki wciąż sekwencyjna, planuję Parallel.For na slice agentów
  • Flow fields – dla 1000+ agentów idących do tego samego celu jeden BFS > A* per agent (O(N) vs O(N·log·N))
  • Utility AI – scoring potrzeb (głód², pragnienie, sen, zabawa) z priorytetyzacją kwadratową dla emergencji
  • Game Over – śmierć agentów z głodu, currently agenci po prostu znikają gdy staną się głodni
  • Pause, speed control, builder mode – UI planowane na drugą iterację

Dlaczego to robię publicznie

Bo symulacje to jeden z najtrudniejszych, ale najbardziej satysfakcjonujących gatunków w gamedevie. Songs of Syx dowiodło, że proste zasady mogą wygenerować niesamowitą złożoność. Ale żeby to zrozumieć – trzeba zbudować.

SimSandbox to mój sposób — prywatne laboratorium, w którym uczę się architektury silników symulacyjnych od podstaw.

Linki


Piszę na bieżąco o postępach. Daj znać jeśli masz pytania lub sugestie!