Как следует обрабатывать установочный код в entity-component-system?

Я пишу фреймворк ECS, а также игру с ним на Python. В структуре ECS компоненты должны содержать только данные. Однако иногда для создания данных требуется код настройки. Например, в аудиокомпоненте данные будут представлять собой громкость звука для воспроизведения и путь к аудиофайлу. Но в библиотеке воспроизведения звука есть объекты для представления звуков, например, у которых есть метод sound.play(). Мой вопрос в том, должен ли этот объект создаваться в компоненте, который как бы нарушает правило, согласно которому сущности должны быть чистыми данными, или в системе. Если это лучше всего сделать в системе, это нужно будет сделать только один раз (и это нанесет ущерб производительности, если аудиофайл нужно будет создавать один раз для каждого кадра). Как лучше всего это сделать?


person kCODINGeroo    schedule 23.04.2019    source источник


Ответы (1)


Мой вопрос в том, должен ли этот объект создаваться в компоненте, который как бы нарушает правило, согласно которому сущности должны быть чистыми данными, или в системе. Если это лучше всего сделать в системе, это нужно будет сделать только один раз (и это нанесет ущерб производительности, если аудиофайл нужно будет создавать один раз для каждого кадра). Как лучше всего это сделать?

Когда вы используете модель outboard для системы сущностей, я думаю, что одной из наиболее важных задач, которую необходимо решить, является управление жизненным циклом как сущностей, так и компонентов. Без этого становится действительно сложно написать системный код, который не начинал бы напоминать спагетти.

Существуют реализации, в которых они ожидают, что вы создадите объект, создадите его список компонентов, а затем активируете объект. После активации объекта вы не можете добавлять или удалять компоненты, а только изменять значения атрибутов компонента. Чтобы добавить / удалить компоненты, вы деактивируете объект, вносите изменения, а затем повторно активируете его.

Предположим, мы используем этот процесс жизненного цикла сущности.

Когда объект с аудиокомпонентом активируется, аудиосистема получает уведомление, считывает атрибуты из аудиокомпонента и, наконец, создает звуковой объект аудиосистемы. В этом случае ответственность за ведение бухгалтерской карты между компонентом и звуковым объектом будет лежать в основе системы. Эта внутренняя карта - это то, что система будет использовать для каждого кадра для обновления.

Когда объект с аудиокомпонентом деактивирован, аудиосистема получает уведомление, уничтожает звуковой объект аудиосистемы, связанный с компонентом на внутренней карте бухгалтерского учета, а затем удаляет запись из внутренней карты.

person Naros    schedule 06.05.2019
comment
Разве это не может быть реализовано таким образом, чтобы разрешить добавление и удаление компонентов из сущностей, путем автоматической активации и деактивации сущности при изменении ее списка компонентов и, таким образом, автоматического уведомления системы об изменениях? - person kCODINGeroo; 10.05.2019
comment
Безусловно, но для объектов, которые не очень часто меняются от кадра к кадру, существует вариант использования для создания объекта, добавления всех его компонентов, а затем выполнения одной активации в системах для указанного объекта. Это намного быстрее, чем вызов каждой системы для этой сущности N-количество раз. - person Naros; 10.05.2019