Я думаю, что в этом случае самый простой метод будет лучшим: вы можете просто сохранить указатель на компонент Transform
в компонентах, которые его читают / пишут.
Я не думаю, чтоиспользование событий (или некоторой другой косвенности, например наблюдателей) решает любую реальную проблему здесь.
Transform
компонент очень прост - это не то, что будет изменено во время разработки.Абстрагирование доступа к нему на самом деле сделает код более сложным и сложным в обслуживании.
Transform
- это компонент, который будет часто изменяться для многих объектов, возможно, даже большинство ваших объектов будет обновлятьсяэто каждый кадр.Отправка событий каждый раз, когда есть изменение, имеет свою стоимость - вероятно, намного выше, чем простое копирование матрицы / вектора / кватерниона из одного места в другое.
Я думаю, что использование событий или какой-либо другой абстракции, не решит другие проблемы, такие как несколько компонентов, обновляющих один и тот же компонент Transform
, или компоненты, использующие устаревшие данные преобразования.
Как правило, средства визуализации просто копируют все матрицы отображаемых объектов в каждом кадре,Нет смысла кэшировать их в системе рендеринга.
Такие компоненты, как Transform
, используются часто.Их чрезмерная сложность может быть проблемой во многих различных частях движка, в то время как использование простейшего решения, указателя, даст вам большую свободу.
Кстати, есть также очень простой способ убедиться, чточто RenderComponent
будет читать преобразование после того, как было обновлено (например, PhysicsComponent
) - вы можете разделить работу на два шага:
Update()
inкакие системы могут изменять компоненты, и
PostUpdate()
, в которых системы могут считывать данные только из компонентов
Например, PhysicsSystem::Update()
может копироватьпреобразовать данные в соответствующие TransformComponent
компоненты, и тогда RenderSystem::PostUpdate()
сможет просто прочитать из TransformComponent
, без риска использования устаревших данных.