производительность — написать эффективную систему объектов, как в переполнении стека

Я пытаюсь создать эффективную «систему сущностей» на C ++, я прочитал много блогов / статей / документации в Интернете, чтобы получить много информации, но у меня снова возникли некоторые вопросы.

Я нашел две интересные темы:

  • Система управления данными
  • Компонентная система

Для меня две системы выглядят очень похоже.

Итак, я нашел этот пример Адама Смита: https://stackoverflow.com/a/2021868

Мне нужна гибкая система, подобная этой:

// Abstract class
class Component
{
// data here
}

// exemple
class Car : public Component
{
// Data here
}

// Entity with components
class Entity
{
std::vector<Component*> components;
}

Итак, если моя сущность имеет следующие компоненты: Car, Transform, Sprite,
мой массив компонентов будет иметь линейные данные, такие как управляемая данными система?

Теперь у меня есть системы:

class System
{
virtual void init();
virtual void clear();
virtual void update();

std::unordered_map< const char*, Entity*> entities;
}

class RendererSystem : public System
{
// Methods's definition (init, clear, …).

void update()
{
for( entity, … )
{
Sprite* s = entity->getComponent('sprite');
...
}
}
}
  • Я читал, что виртуальные функции плохие, это плохо в таком случае?
  • Получить компонент нужен static_cast, это плохо?
  • В системе, управляемой данными, я видел указатель везде, например, где «исходные» переменные, мне нужно везде ставить новые, или у меня будет класс с массивом тех же данных?
  • Я сделал это правильно?

Все эти точки выглядят «размытыми» в моей голове.

5

Решение

  1. У виртуальных функций есть некоторые накладные расходы, но они не должны вас волновать, если вы не выполняете миллионы вызовов в секунду, поэтому просто игнорируйте этот факт.
  2. Статическое приведение не является плохим само по себе, но оно нарушает проверку статического типа, где оно используется, поэтому, если вы можете переместить поведение внутри объекта, на котором вы производите приведение, так что вы просто вызываете соответствующий метод без необходимости знать конкретный экземпляр времени выполнения возражать тогда лучше
  3. Непонятно, о чем вы спрашиваете, даже если у вас есть векторы элементов в подходе, управляемом данными, каждый элемент в коллекциях должен быть выделен с помощью new (если это указатель). Затем, как только вы выделите его, вам не нужно будет делать это снова, как только вы передадите ссылку на элемент вокруг
1

Другие решения

Других решений пока нет …