Какова роль «систем» в архитектуре сущности на основе компонентов?

Я много читал о сущностных компонентах и ​​системах и думал, что идея объекта, просто являющегося идентификатором, довольно интересна.

Однако я не знаю, как это полностью работает с аспектом компонентов или аспектом системы. Компонент - это только объект данных, управляемый некоторой соответствующей системой. Система столкновений использует некоторые BoundsComponent вместе с пространственной структурой данных, чтобы определить, произошли ли столкновения.

До сих пор хорошо, но что, если несколько систем нуждаются в доступе к одному и тому же компоненту? Где должны жить данные? Система ввода может модифицировать объекты BoundsComponent, но физическая система (ы) нуждается в доступе к тому же компоненту, что и к некоторой системе рендеринга.

Также, как создаются сущности? Одно из преимуществ, о котором я так много читал, - это гибкость в построении объектов. Связаны ли системы с компонентом? Если я хочу представить какой-то новый компонент, должен ли я также ввести новую систему или изменить существующую?

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

Извините за длинный пост (или, по крайней мере, это похоже на моем экране телефона)!

163 голоса | спросил bio595 1 J000000Sunday12 2012, 21:17:55

1 ответ


317

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

Я собираюсь представить аналогию для архитектуры entity /component /system, которая может помочь. Давайте подумаем о сущности, такой как ключ.

Объект

Ключ сущности

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

Система

Блокировка системы движения

Блокировка работает только в том случае, если наш ключ имеет зубы как для положения, так и для скорости. Эта система обрабатывает только объекты, которые имеют положение и скорость. Существует несколько способов настроить, как эти системы распознают, какие объекты обрабатывать, но один из способов - использовать long. Каждый бит зарезервирован для типа компонента. В нашем примере можно взять 4-битный тип вместо 64-битного. У нашего примерного объекта будут все доступные компоненты. Таким образом, ключом будет 1111. Затем система ищет любую сущность, которая имеет 11--. (Значения - не заботятся, потому что движение не волнует, есть ли спрайт или здоровье). Он может проверять объект с помощью простой операции AND. Таким образом, наша сущность соответствует if ((1111 & 1100) == 1100). Если я потерял вас, посмотрите еще немного о побитовые операции .

Как видите, системы имеют доступ к внешним ресурсам. Они могут получить доступ к времени, графике, звуку и так далее. Это просто небольшие процессоры, которые принимают по одному ключу за раз, и обрабатывают данные. Вы видите, что система движения принимает скорость, дельта-время и положение; затем выполняет некоторые вычисления и сохраняет результат обратно в положение.

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

Давайте взглянем на другую систему, чтобы упростить идею:

Блокировка системы чертежа

Это наша система рисования. Он ищет компоненты, которые соответствуют 1-1-. Этот объект соответствует, потому что: ((1111 & 1010) == 1010) Кроме того, вы можете видеть, что эта система выводит информацию на экран, вычерчивая спрайт объекта в его положение.

ОК, еще один. Давайте посмотрим на другую сущность и посмотрим, как она может соответствовать нашему примеру.

Недвижущаяся сущность объекта

Как вы можете видеть, этот объект имеет меньше подключенных к нему компонентов. Посмотрев на компоненты, которые у него есть, похоже, что это может быть статический предмет, такой как камень. У него просто позиция и спрайт. Он не собирается двигаться, и на него не повлияют изменения здоровья. Этот объект будет генерировать ключ 1010. Итак, какие системы работают на этом объекте? Позволяет проверить:

Против нашей системы движения:     ((1010 & 1100) != 1100) Нет. Похоже, система движения не заботится об этом объекте, потому что у него нет необходимых компонентов.

Против нашей системы рисования:     ((1010 & 1010) == 1010) Эй, это совпадение. Эта организация будет работать с помощью системы рисования. Система рисования рисует спрайт в указанной позиции.


Надеюсь, вы увидите, как легко было бы добавить еще одну систему, которая будет принимать наши компоненты и работать с ними. Позвольте мне убедиться, что я задал ваши вопросы:

  

Что делать, если несколько систем нуждаются в доступе к одному и тому же компоненту? Где должны жить данные?

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

  

Как создаются объекты? Связаны ли системы с компонентом? Если я хочу представить какой-то новый компонент, должен ли я также ввести новую систему или изменить существующую?

Сущности - это всего лишь мешки с компонентами. Они имеют уникальный идентификатор и список компонентов. Системы привязаны только к компонентам, описанным выше. Вы можете иметь компоненты без системкоторые действуют на них, но это довольно бессмысленно. Аналогичным образом вы можете иметь системы, которые ищут компоненты, которые не имеют сущности. Это менее бессмысленно, потому что они могут просто ждать создания сущности, которая соответствует их блокировке. Итак, да, если вы представляете новый компонент, вы хотите создать систему, которая использует этот компонент. В противном случае вы просто добавляете зубы в свой ключ для блокировки, которая не существует.

  

Если мой объект - это просто идентификатор, как я могу узнать, что мой объект робота должен быть перемещен или отображен и, таким образом, изменен некоторой системой?

Я думаю, что я отвечаю на это с идеей long, которая определяет компоненты, содержащиеся в сущности. Вы знаете, потому что ключ подходит для блокировки.

Уф! Это был длинный пост! (Или, по крайней мере, это похоже на мой большой монитор.)

ответил MichaelHouse 2 J000000Monday12 2012, 04:51:55

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132