Как следует обрабатывать код установки в системе компонентов-сущностей?

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
394
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

My question is whether this object should be created in the component, which sort of violates the rule that entities should be pure data, or in the system. If it should best be done in a system, it would only need to be done once (and it would harm performance if the audio file needed to be created once per frame). What is the best way to do this?

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

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

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

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

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

Нельзя ли также реализовать это таким образом, чтобы можно было добавлять и удалять компоненты из сущностей, автоматически «активируя» и «деактивируя» сущность при изменении списка ее компонентов и, таким образом, автоматически уведомляя систему об изменениях?

kCODINGeroo 10.05.2019 15:15

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

Naros 10.05.2019 18:56

Другие вопросы по теме

Расширение (альтернатива) шаблона проектирования репозитория?
Шаблон проектирования, как выключатель электричества?
Какова наилучшая стратегия фиксации изменений с использованием шаблона UnitOfWork?
Как сохранить путь коллекции для модели?
Путаница в том, как работать с шаблоном модуля
Я занимаюсь рефакторингом платежного модуля для своего сайта. У него много провайдеров, режимов и операций, и они продолжают добавляться. Нужен совет по архитектуре
Зачем нам нужно использовать шаблон проектирования Builder, когда мы можем сделать то же самое с сеттерами?
Не удается преобразовать строку в ошибку класса построителя при реализации шаблона построителя
Как исправить этот шаблон электронной почты json
Является ли изменение кодов одноэлементных классов единственным способом расширить функциональность синглтона при использовании одноэлементного шаблона версии перечисления?