そのような別のリストにエンティティを含める必要があるアーキテクチャに取り組んでいます:
- Renderer -> コンポーネントのリスト (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 を使用すると、パフォーマンスの問題が発生しましたか? (参照を使用しています):
御時間ありがとうございます!