Наявність локальних списків для кожної системи збільшить використання пам'яті для класів.
Це традиційний простір-час .
Хоча ітерація через усі сутності та перевірка їх підписів є прямим кодом, вона може стати неефективною, оскільки кількість ваших систем зростає - уявіть собі спеціалізовану систему (нехай це буде введення), яка шукає свою, ймовірно, єдину сутність, яка представляє інтерес серед тисяч непов'язаних об'єктів .
Зважаючи на це, цей підхід все ще може бути досить хорошим залежно від ваших цілей.
Хоча, якщо ви переживаєте за швидкість, то, звичайно, варто розглянути й інші рішення.
Чи повинна кожна система мати локальний перелік організацій, які їх цікавлять?
Саме так. Це стандартний підхід, який повинен забезпечити вам гідну ефективність і досить легко здійснити. На мою думку, накладні витрати на пам'ять є незначними - ми говоримо про зберігання покажчиків.
Тепер, як підтримувати ці "списки інтересів", може бути не так очевидно. Що стосується контейнера даних, то std::vector<entity*> targets
всередині класу системи цілком достатньо. Тепер я це роблю:
Видалення сутності є повністю аналогічним, з тією лише різницею, яку ми видаляємо, якщо система збігається з нашим поточним підписом (це означає, що сутність там була) і не збігається з новим підписом (це означає, що суб'єкт господарювання більше не повинен бути там ).
Тепер ви можете розглянути можливість використання std :: list, оскільки видалення з вектора - це O (n), не кажучи вже про те, що вам доведеться переміщувати великий фрагмент даних кожного разу, коли ви видаляєте з середини. Насправді, вам не потрібно - оскільки нам не байдуже обробляти замовлення на цьому рівні, ми можемо просто зателефонувати на std :: delete та жити з тим фактом, що при кожному видаленні нам потрібно лише виконати O (n) пошук нашої підлягає видаленню.
std :: список дозволить вам видалити O (1), але з іншого боку у вас є додаткова накладна пам'ять. Також пам’ятайте, що більшу частину часу ви будете обробляти об'єкти, а не видаляти їх - і це, безумовно, робиться швидше за допомогою std :: vector.
Якщо ви дуже критичні для продуктивності, ви можете розглянути навіть інший шаблон доступу до даних , але в будь-якому випадку ви підтримуєте якийсь "список цікавих". Пам’ятайте, що якщо ви триматимете API Entity System достатньо абстрагованим, це не повинно бути проблемою для вдосконалення методів обробки сутності системи, якщо ваш частота кадрів знижується через них - тому поки що виберіть метод, який вам найпростіше кодувати - лише потім профілі та покращуйте, якщо потрібно.