ECS? Насправді я припускаю, що це може бути недоношеним, якщо так, щоб багато вдуматись у орієнтовану на дані сторону дизайну та орієнтувати різні повторення, оскільки це може вплинути на ваші дизайни інтерфейсу , а останнє дуже дорого змінити пізно в гра. Крім того, ECS просто вимагає багато роботи та продуманих передумов, і я думаю, що варто використати частину цього часу, щоб переконатися, що це не надасть вам горя продуктивності на рівні дизайну далі за лінією, враховуючи, як це буде в основі вашого весь моторошний двигун. Ця частина відблискує до мене:
unordered_map<string,[yada]>
Навіть при невеликих оптимізаціях рядків у вас є контейнер (рядки) змінного розміру всередині іншого контейнера змінного розміру (unorряд_maps). Насправді, невеликі струнні оптимізації можуть бути на насправді так шкідливо , як корисно в цьому випадку , якщо ваша таблиця дуже рідко, так як невелика оптимізація рядки означатиме , що кожен невикористаний індекс хеш - таблиці все одно буде використовувати більше пам'яті для оптимізації SS ( sizeof(string)
буде бути набагато більшим) до точки, коли загальна накладна частина пам'яті вашої хеш-таблиці може коштувати дорожче, ніж все, що ви зберігаєте в ній, особливо якщо це простий компонент, як компонент позиції, крім того, щоб мати більше пропусків кешу з величезним кроком щоб перейти від одного запису в хеш-таблиці до іншого.
Я припускаю, що рядок - це якийсь ключ, як ідентифікатор компонента. Якщо це так, це вже робить речі значно дешевшими:
unordered_map<int,[yada]>
... якщо ви хочете отримати переваги від того, щоб мати зручні для користувача імена, якими можуть користуватися скриптери, наприклад, інтерновані рядки можуть дати вам найкраще з обох світів тут.
Це означає, що якщо ви можете зіставити рядок на досить низький діапазон щільно використовуваних індексів, то ви можете просто зробити це:
vector<[yada]> // the index and key become one and the same
Причина, яку я не вважаю такою передчасною, полягає в тому, що, знову ж таки, це може вплинути на ваш дизайн інтерфейсу. Сенс DOD не в тому, щоб намагатися створити найефективніші представлення даних, які можна уявити за допомогою одного ІМО за один раз (це, як правило, слід досягати ітеративно в міру необхідності), а думати про них достатньо, щоб розробити інтерфейси зверху для роботи з цим дані, які залишають вам достатньо місця для дихання для профілю та оптимізації без каскадних змін дизайну.
Як наївний приклад, програмне забезпечення для обробки відео, яке поєднує весь свій код з цим:
// Abstract pixel that could be concretely represented by
// RGB, BGR, RGBA, BGRA, 1-bit channels, 8-bit channels,
// 16-bit channels, 32-bit channels, grayscale, monochrome,
// etc. pixels.
class IPixel
{
public:
virtual ~IPixel() {}
...
};
Не вдасться далеко дійти без потенційно епічного переписування, оскільки ідея абстрагування на рівні одного пікселя вже вкрай неефективна ( vptr
сама по собі часто коштуватиме більше пам'яті, ніж весь піксель) порівняно з абстрагуванням на рівні зображення (що буде часто представляють мільйони пікселів). Тому заздалегідь покладіть достатньо продуманих ваших даних на представлення даних, щоб вам не довелося стикатися з таким сценарієм кошмару, і в ідеалі не більше, але тут я думаю, що варто подумати над цим матеріалом заздалегідь, оскільки ви не хочете будувати заплутайте двигун навколо свого ECS і виявіть, що саме ECS є вузьким місцем способами, які вимагають від вас змінити речі на рівні проектування.
Що стосується недоліків кеш-пам'яті ECS, то, на мою думку, розробники часто надто намагаються зробити свій кеш-пам'ять ECS. Він починає видавати занадто мало бабу для долара, щоб спробувати отримати доступ до всіх своїх компонентів ідеально суміжним способом, і часто передбачає копіювання та переміщення даних по всьому місцю. Зазвичай, достатньо добре, скажімо, просто радикси сортувати індекси компонентів до доступу до них, щоб ви отримували доступ до них таким чином, щоб ви хоча б не завантажували область пам'яті в кеш-рядок, а лише виселяли її, а потім завантажували все це знову в одному циклі, просто щоб отримати доступ до іншої частини тієї ж лінії кешу. І ECS не повинен забезпечувати дивовижну ефективність у всьому світі. Це не так, як система введення вигоди від цього стільки, скільки фізика чи система візуалізації, тому я рекомендую орієнтуватися на "добре" ефективність в усьому світі та "відмінна" саме там, де вам це справді потрібно. Що сказано, використанняunordered_map
і string
тут досить просто, щоб уникнути.