Как должен обрабатываться код установки в Entity-Component-System? - PullRequest
0 голосов
/ 23 апреля 2019

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

1 Ответ

1 голос
/ 06 мая 2019

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

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

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

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

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

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

...