Вопросы о Pure ECS (Entity Component System) и системах обновления - PullRequest
0 голосов
/ 17 января 2020

Я написал ECS, но у меня есть несколько вопросов по поводу фазы обновления. (в системах) Я прочитал много статей, но не нашел ссылок на такого рода проблемы.

Для того чтобы получить преимущества от ECS (например, кеш-дружественный), к ним предъявляются следующие требования:

  • Сущность должна быть просто идентификатором.
  • Компоненты должны быть только чистыми данными (структура без логики c).
  • Системы содержат logi c и обновите компоненты.
  • Нет взаимодействия между системами (вместо этого системы взаимодействуют, добавляя компоненты «Tag» к сущностям).

Итак, лог c применяется в каждой системе нормально, и все работает, когда они не «пользовательский код». Но когда мы имеем дело с пользовательским кодом (например, пользователь может присоединить код C ++ к объекту (например, Unity, Unreal)), возникают проблемы:

  1. Поскольку компоненты содержат только данные, когда пользователь изменяет локальную позицию, мировая позиция не обновляется (мировая позиция будет вычислена, когда система преобразования будет обрабатывать каждый компонент преобразования. Поэтому, если пользователь запрашивает мировую позицию после изменения своей локальной позиции, он будет получить предыдущую мировую позицию, а не фактическую.
  2. Когда сущность удаляется, ее дочерние элементы должны быть удалены. Поскольку компонент содержит только данные, а не логи c, дочерние элементы не будут удалены (это будет при следующем обновлении родительской системы). Таким образом, у нас есть некоторая «задержка» (дочерние элементы все еще будут доступны, но будут удалены при следующем обновлении родительской системы).
  3. Предположим, у нас есть объекты A, B , C. B является дочерним элементом A. В пользовательском коде (код c ++, прикрепленный к объекту) пользователь устанавливает родительский элемент для B имеет C, затем удаляет объект A. Когда родительская система обновится, она обнаружит, что A был удален (она также может обнаружить, что родительский объект объекта A изменился), но как система может узнать, является ли объект A был удален после смены родительского объекта Entity B или ранее?

Добавление logi c в компоненты разрушит преимущество чистого ECS (выполнение одинаковых действий над всеми одинаковыми компонентами, в способ кеширования), так что ИМХО это не решение.

У кого-нибудь есть решение? Я хотел бы знать, как вы справляетесь с такого рода проблемами в вашей реализации ECS.

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...