我正在研究一种架构,我需要在不同的列表中有一个实体,如下所示:
- 渲染器 -> 组件列表 (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 - 我是否需要在我的程序中到处使用“实体”类型(在参数中,...)?
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 泄漏分析器查看时,我可以看到没有删除实体的内存在增长。所以我刚刚尝试在我的向量中插入创建实体,但我没有泄漏,为什么?问题出在哪里 ?哦。
4 - 如果我在游戏中使用 smart_ptr,我是否有一些性能问题?(我正在使用参考):
谢谢你的时间!