0

そのような別のリストにエンティティを含める必要があるアーキテクチャに取り組んでいます:

  • 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 を使用すると、パフォーマンスの問題が発生しましたか? (参照を使用しています):

御時間ありがとうございます!

4

1 に答える 1

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. はい、スマート ポインターを使用するとパフォーマンスが低下します。ただし、コアループの問題として測定できるようになるまでは、心配しないでください。問題になるだけのペナルティにはならない場合があります。
于 2012-09-12T09:51:21.777 に答える