Я недавно внедряю систему компонентов Entity для своего игрового движка. Каждый объект хранит карту компонентов, как, что:std :: map Скорость доступа слишком медленная?
Component.h
enum COMPONENT_INFO {
COMPONENT_POSITION = 0,
COMPONENT_PHYSICS,
COMPONENT_RENDERABLE
};
Entity.h
class Entity {
public:
std::bitset<NUM_COMPONENTS> componentBits;
std::map<COMPONENT_INFO, Component*> components;
..
..
Component *getComponent(COMPONENT_INFO inf) {
return components[inf];
}
};
И мой класс System обновляет каждый объект в каждом кадре так:
void update(Entity *e, float delta) {
PositionComponent *cmp=(PositionComponent*)e->getComponent(COMPONENT_INFO::COMPONENT_PHYSICS);
//x += 1.0f;
cmp->x += 1.0f;
}
Все работает по назначению, но у меня есть огромная проблема с производительностью при доступе к карте. Когда я создаю 10000 сущностей и перебираю их (система выполняет итерацию на самом деле), я получаю 80 FPS с голубой пустой системой (без визуальных эффектов, просто на экране). Но когда я закомментировать части доступа и использовать только x += 1.0f;
, FPS increadibly увеличивается до 1000. Как что:
void update(Entity *e, float delta) {
x += 1.0f; //btw the system has a local x value.
}
Так что проблема просто в доступе компоненты через карту. Что еще я могу использовать в такой системе? Или, может быть, я делаю что-то неправильно в доступе к карте?
Важное изменение: это всего лишь тестовый диск, я имею в виду, что на сущность может быть много компонентов, а не только 3. Я написал их только для тестирования.
Учитывая, что у вас есть только три ключа, вы можете используйте простой массив или 'std :: array'. Но вы уверены, что проблема действительно в доступе к элементам карты? –
juanchopanza
Да, проблема заключается в доступе к элементам карты (хотя я удаляю cmp-> x line, fps все равно 80). Между прочим, между ними не будет 3 ключа. Например, если у меня есть 64 разных компонента, все сущности будут вынуждены удерживать их отдельно, если я использую фиксированные массивы. – deniz
Can вы кешируете результат карты в своем классе, чтобы предотвратить r быстрый поиск? –