ECS - Архитектура динамических миров (free)
ECS архитектура позволяющая управлять комплексными структурами без экспоненциального повышения сложности поддержки и расширения проекта.
Но помимо банального удобства мы получаем следущее:
- быстрое ядро, в связи с тем что структура ECS это обычный массив то мы можем эффективно использовать память процессора (да, именно его)
- при правильно построенной работе с этим ядром, мы снижаем влияние сборщика мусора. Сборщик довольно прожорлив к ресурсам, лучше бы его не будить.
- отделение логики от данных
- отказоустойчивость
- гибкость, мы можем легко добавлять и удалять свойства Entity и не "ломать" код
- сумасшедшие возможности оптимизации
Готовая реализация (рабочий код) находится тут - https://boosty.to/rudimbo/posts/89d9e285-c5df-4166-84e9-f998fdab97d4
Советы по использованию:
- не добавляйте методы в компоненты
- не мутируйте данные, если в компоненте position свойство X = 0 (number) следите чтобы тип данных оставался прежним.
- используйте быстрые методы перебора массивов (for)
- оптимизируйте методы перебора. Где-то нужно пробежать по всем объектам, где-то только найти нужный или несколько и остановиться
- старайтесь избегать вложенных for / foreach
- не удаляйте entity из середины массива, либо пометьте как null либо сместите на последний индекс, после чего удаляйте.
Как создать ECS структуру?
Первым делом необходимо определить контейнер в котором будут находиться наши сущности (entity), это может быть массив или объект.
Этот контейнер обычно называют World и должен иметь функционал работы с сущностями, добавление, поиск, удаление, работа с компонентами, прикрепление их к сущности, удаление из сущностей.
Далее делаем сущность, она по сути является простым объектом с полями - id, components.
Итак компонент, основной двигатель ECS.
Делаем маленький, изолированный объект (ака класс) с названием характеризующим данные которые в нем будут лежать.
Помним что компонент ничего не умеет! Это чистые данные, как корзина для мусора.
Последнее звено в цепи ECS - система.
Логический блок, вот тут мы можем оторваться и написать логику игры.
Здесь можно почти всё! Бегаем по сущностям, изменяем данные в их компонентах, сравниваем перетасовываем, удаляем и т.д.
Поздравляю! Теперь вы знаете как создать ECS архитектуру для игры.
Моя реализация ECS (рабочий код) находится тут - https://boosty.to/rudimbo/posts/89d9e285-c5df-4166-84e9-f998fdab97d4