Entity-component-system

wzorzec projektowy w inżynierii oprogramowania

Entity-component-system, często używany skrót ECSwzorzec architektoniczny wykorzystywany głównie przy tworzeniu gier komputerowych i pozwalający na dużą elastyczność w projektowaniu całościowej architektury oprogramowania. Wzorzec wyróżnia trzy kluczowe elementy: jednostki (ang. entities), komponenty (ang. components) oraz systemy (ang. systems)[1]. Bazuje na podejściu zwanym kompozycją ponad dziedziczenie (ang. composition over inheritance) i rozwiązuje problem obecny w programowaniu obiektowym, gdzie poprzez dziedziczenie tworzone są rozbudowane hierarchie klas, które są trudne do modyfikowania oraz występuje w nich redundancja. ECS zapewnia izolację poszczególnych elementów, przejrzystość, modularność i łatwość rozszerzania kodu, jednakże problematyczne może okazać się tworzenie komunikacji pomiędzy poszczególnymi systemami[2].

Jednostki (ang. entities) mają identyfikator; sprawiają, że środowisko jest świadome istnienia indywidualnego obiektu oraz funkcjonują jako obiekty, na które składają się komponenty. Komponenty (ang. components) to elementy zawierające dane, a nie logikę. Mogą być dołączane do jednostek, zapewniając im właściwości. Np. „komponent zdrowia” może być dołączony do „jednostki rycerza” i zapewnić mu zmienną typu integer lub float, która będzie odpowiadała za zdrowie postaci[1]. System operuje i manipuluje komponentami[3]. Uruchamia on logikę na jednostkach w celu wykorzystania lub zmiany danych zawartych w komponentach[2]. System to „zamknięte środowisko”, które nie ma na własność jednostek i komponentów oraz ma do nich dostęp tylko poprzez niezależnego managera obiektów, który zajmuje się ich cyklem życia. Występują dwa podejścia przy tworzeniu systemów. Pierwsze wymaga, aby dla każdego komponentu był stworzony oddzielny system, np. jeżeli w grze występuje „komponent kolizji”, to powinien istnieć także „system kolizji”. Podejście to jest bardzo restrykcyjne i nie przewiduje, że komponenty mogą na siebie oddziaływać. Natomiast drugie podejście pozwala na grupowanie komponentów w jeden system, np. jeżeli istnieje „komponent kolizji” i „komponent ciała stałego”, to może być stworzony jeden system nazwany „systemem fizyki”[1].

Składowe elementy wzorca komunikują się pomiędzy sobą poprzez tzw. „pozyskiwanie zdarzenia” (ang. event sourcing). Zdarzenia są dystrybuowane poprzez managera zdarzeń (ang. event manager) i wszyscy zainteresowani zdarzeniami mogą ich nasłuchiwać. Jeżeli jednostka, system, lub nawet komponent ma ważną zmianę do zakomunikowania (np. zmianę pozycji obiektu), to może on przekazać to do managera zdarzeń, a ten nada tę informację do wszystkich, którzy oczekują na to zdarzenie[1].

ECS jest zaimplementowany w silniku CryEngine[4] oraz Amazon Lumberyard[5]. Jest on dostępny także w wersji preview silnika Unity. Aktualnie trwają pracę nad pełną implementacją tego wzorca w tym środowisku[6].

Przypisy edytuj

  1. a b c d Tobias Stein: The Entity-Component-System – An awesome game-design pattern in C++ (Part 1). Gamasutra, 2018-04-23. [dostęp 2018-04-23]. (ang.).
  2. a b Daniel Hall, Zoe Wood: ECS Game Engine Design. digitalcommons.calpoly.edu, 2014-06-01. [dostęp 2018-04-23]. (ang.).
  3. Artur Śmiarowski: Entity Component System. alemil.com, 2018-02-17. [dostęp 2018-04-23]. (ang.).
  4. Ivan Hawkes: Switching to CRYENGINE 5.3 New Entity System. hawkes.info, 2017-01-08. [dostęp 2018-04-23]. [zarchiwizowane z tego adresu (2018-04-23)]. (ang.).
  5. Programmer's Guide to Entities and Components. Amazon. [dostęp 2018-05-12]. (ang.).
  6. Community Team: Unity Unveils 2018 Roadmap at GDC. blogs.unity3d.com, 2018-03-20. [dostęp 2018-04-23]. (ang.).