Наличие локальных списков для каждой системы увеличит использование памяти для классов.
Это традиционный компромисс пространства-времени .
Хотя итерация по всем сущностям и проверка их сигнатур прямолинейны для кода, она может стать неэффективной по мере роста числа ваших систем - представьте себе специализированную систему (пусть она будет входной), которая ищет свой, вероятно, единственный объект интереса среди тысяч не связанных между собой сущностей ,
Тем не менее, этот подход все еще может быть достаточно хорошим в зависимости от ваших целей.
Хотя, если вы беспокоитесь о скорости, есть, конечно, другие решения для рассмотрения.
Должна ли каждая система иметь локальный список сущностей, в которых они заинтересованы?
Точно. Это стандартный подход, который должен дать вам достойную производительность и достаточно прост в реализации. Накладные расходы памяти, на мой взгляд, ничтожны - мы говорим о хранении указателей.
Теперь, как поддерживать эти «списки интересов», может быть не так очевидно. Что касается контейнера данных, то std::vector<entity*> targets
внутри класса системы вполне достаточно. Теперь то, что я делаю, это:
Удаление сущности полностью аналогично, с той разницей, которую мы удаляем, если система соответствует нашей текущей подписи (что означает, что сущность была там), и не совпадает с новой подписью (что означает, что сущность больше не должна быть там). ).
Теперь вы можете рассмотреть возможность использования std :: list, потому что удаление из вектора - это O (n), не говоря уже о том, что вам придется сдвигать большой кусок данных каждый раз, когда вы удаляете из середины. На самом деле, вам не нужно - поскольку нам не нужен порядок обработки на этом уровне, мы можем просто вызвать std :: remove и согласиться с тем фактом, что при каждом удалении нам нужно только выполнить O (n) поиск нашего подлежащее удалению лицо.
std :: list даст вам O (1) удалить, но с другой стороны у вас есть немного дополнительной памяти. Также помните, что большую часть времени вы будете обрабатывать объекты, а не удалять их - и это, безусловно, выполняется быстрее с использованием std :: vector.
Если вы очень критичны к производительности, вы можете рассмотреть даже другой шаблон доступа к данным , но в любом случае вы поддерживаете какие-то «списки интересов». Однако помните, что если вы сохраняете свой API-интерфейс Entity System достаточно абстрагированным, не должно возникнуть проблем с улучшением методов обработки сущностей систем, если из-за них снижается частота кадров - поэтому пока выберите метод, который проще всего для кода - только затем профиль и улучшить, если это необходимо.