Specifikace: Entity component system

Jako zápočťák bych chtěl vytvořit implementaci frameworku pro "Entity
component system" v jazyce C#, či přesněji v jeho podmnožině, která dokáže
pomocí Xamarinu běžet také na Androidu.

ECS je způsob simulace objektů (entit) v nějaké hře, který se vyznačuje
hezkým logickým dělením na data a chování, snadnou paralelizací a když je
správně napsaný, tak by měl být i hodný na procesorové keše. Celková
myšlenka ECS je, že spousta druhů entit se vlastně chová podobně a je mnohem
šikovnější toto chování skládat z menších komponent než ho psát nějakou OOP
hiearchií/dědičností.

Ve své implementaci se chci soustředit hlavně na toto logické dělení a pro
programátora snadné psaní systémů a komponent bez zbytečného copypastování
kódu. Výkon je sekundární, ale také bych ho chtěl v rámci možností
maximalizovat. Paralelizace bude zcela automatická (pokud nějaká bude), u
každého systému se jen určí, na kterých ostatních systémech závisí a zda je
u něj paralelizace povolena.

Odevzdám zdrojový kód knihovny spolu s nějakými ukázkovými entitami a
systémy, případně osobně předvedu prototyp hry, pro kterou je tento projekt
určen. Inspiruji se implementacemi podobných systémů, např. v enginu Unity
nebo ve hře Overwatch [1].

Celý framework bude vlastně jedna velká hlavní třída, která bude na začátku
inicializována seznamem všech systému/komponent, něco si vevnitř přechroustá
a pak už se na ní jen bude každý krok simulace volat nějaká "Update" metoda
a sama už zajistí spuštění všech systémů ve správném pořadí atd. Bude si
vevnitř pamatovat i seznam všech entit, do kterého půjde entity přidávat a
odebírat za běhu systémů, které je používají a které ke všemu můžou běžet i
z více vláken. Také bude musel nějak rychle určovat, která entita patří
kterému systému.

Jak ECS vypadá z pohledu programátora, který píše herní logiku:

    - Systém bude nějaká třída, ve které bude nějak specifikováno, jak
závisí na jiných systémech (musí se vykonat před X a zároveň až poté co
doběhne Y) a které komponenty potřebuje - spustí se právě na těch entitách,
které tyto komponenty obsahují, a zároveň by u těchto entit měl číst/psát
jen do těchto komponent. Dále bude obsahovat metodu Process, která tento
systém vyhodnotí pro jednu entitu. Potřebné komponenty této entity metoda
získá buď přímo jako objekty ze svých parametrů nebo v parametru dostane jen
odkaz/id entity a komponenty si z ní načte sama. Framework samotný zařídí,
aby při každém updatu herní logiky se každý systém spustil (zavolalo se
Process) na každé entitě, která má potřebné komponenty daného systému.

    - Komponenta bude prakticky libovolná třída nebo struct.

    - Entita je jen něco, co drží komponenty pohromadě. Chování nějaké
entity je definováno právě tím, jaké komponenty obsahuje.

Rozšířený cíl: podpora interpolace stavu entit

Někdy je vhodné updatovat simulaci hry jen například na frekvenci 30Hz,
zatímco na obrazovku se vykresluje obraz na 60Hz nebo více. Aby byl obraz
stále plynulý, je nutné vytvořit nějaké mezikroky, které se budou zobrazovat
na nové snímky i když vlastní stav simulace se nezměnil. Zatímco interpolaci
samotnou provede až implementace konkrétních systému, ECS framework by ji
měl podporovat například tím, že zajistí, že se nesmíchají data komponent
"pravé" simulace s daty komponent použitých pro vykreslení interpolovaných
snímků.