Правильное использование умных указателей без утечек

Я работаю над архитектурой, где мне нужно, чтобы сущность была в другом списке:

  • Рендерер -> Список компонентов (SpriteComponent)
  • Collisioner -> Список компонентов (PhysicComponent)

Я думаю, что умный указатель — лучшее решение для управления всеми этими ссылками, поэтому я начал изучать его, но у меня есть некоторые проблемы, и я очень удивлен, если использую их правильно.


Объяснения:

У меня есть абстрактный класс: IEntity

class IEntity {
public:
IEntity( World& world );
private:
World* world;
public:
std::tr1::weak_ptr<IEntity> weak_this;
};

typedef std::tr1::shared_ptr<IEntity> Entity;

И у меня есть метод для создания сущностей в EntityManager:

Entity EntityManager::createEntity() {
Entity entity( new IEntity( *this->world ) );
entity->weak_this = entity;
this->entityList.add( &entity );
return entity;
}

В моем классе EntityManager у меня есть вектор «Entity» (Of shared_ptr):

std::vector<Entity> entityList;

1 — Мне нужно было использовать тип «Entity» везде в моей программе (в параметрах, …)?

2 — Если у меня есть это:

class IComponent {
public:
IComponent();
};
typedef std::tr1::shared_ptr<IComponent*> Component;

И у меня есть такой объект:

class SpriteComponent : public Component {
public:
SpriteComponent();
int texture;
};

Хорошо наследовать от shared_ptr? Это выглядит странно для меня, но эта работа.

3 — Я пытался создать 10000 объектов, используя это:

Entity entity = world.getEntityManager().createEntity();

Ссылка на сущность — это толчок в моем векторе «сущности», если я действительно понимаю умный указатель, очищенный вектор удалит все сущности (потому что других ссылок нет). Но когда я смотрю с помощью профилировщика утечек cXode, я вижу рост памяти без удаления Entity. Итак, я только что попытался создать объект без вставки в мой вектор, и у меня нет утечки, почему? В чем проблема ? Оо.

4 — Если я использую smart_ptr в игре, были ли у меня проблемы с производительностью? (Я использую ссылки):

Спасибо за ваше время!

0

Решение

  1. Я бы не назвал это Entity, но возможно EntityPtr или что-то подобное. (Entity предполагает, что его конкретная реализация IEntity)
  2. Не выводить из Component, но из IComponent, Ваш Component умные указатели смогут удерживать объекты типа SpriteComponent,
  3. Ясно на EntityManager.entityList удалил бы объекты, если бы не было никаких других ссылок. Но ваш код, кажется, делает что-то странное при заполнении вектора.

    EntityPtr entity( new IEntity( *this->world ) );
    ...
    this->entityList.add( &entity );
    

    Это добавляет адрес объекта в список объектов, там не должно быть & там.
    Я не уверен, почему это может вызвать утечку, но это определенно неправильно.

  4. Да, использование умных указателей снижает производительность. Но не беспокойтесь об этом, пока вы не сможете измерить это как проблему в ваших основных циклах — это может никогда не быть достаточно штрафом, чтобы иметь значение.
0

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

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

По вопросам рекламы [email protected]