На этой неделе я начал работать над своим движком для игры Vagabond и приступил к реализации шаблона
entity-component-system.
В этой статье я хочу рассказать о своей реализации, которая свободно доступна на
GitHub. Но вместо простого комментирования кода я хочу объяснить, как проектировалась его структура. Поэтому я начну с первой написанной мной реализации, проанализирую её сильные и слабые стороны, а затем покажу, как улучшил её. В конце я перечислю список аспектов, которые также можно улучшить.
Введение
Мотивация
Я не буду рассказывать о преимуществах ECS перед объектно-ориентированным подходом, потому что с этим хорошо справились многие люди до меня. Одним из первых про ECS рассказал на
GDC 2002 Скотт Билас. Среди других знаменитых введений в тему можно назвать
Evolve Your Hierarchy Майка Уэста и главу
Components из потрясающей книги
Game Programming Patterns Роберта Нистрома.
Вкратце скажу, что задача ECS — создание ориентированного на обработку данных подхода к игровым сущностям и удобное разделение данных и логики. Сущности (Entities) составляются из компонентов, содержащих данные. А системы, содержащие логику, обрабатывают эти компоненты.
Если вдаваться в детали, то вместо
наследования в ECS используется
композиция. Более того, этот подход, ориентированный на обработку данных, оптимальнее использует кэш, а значит, достигает отличной производительности.