2016-04-15 6 views
0

私は小さなゲームをコーディングし、私のCを磨きたい++、したがって、私は見つけることができるすべてのファンシーなデザインパターンを使用しています。パフォーマンスの問題、スタック、ヒープ、またはプロトタイプパターン?

は、だから今は

、私は重いパフォーマンスの問題を持っているので、私は間違ったパターンを使用すると仮定)

私は敵のクラスのプロトタイプパターンを使って、異なる敵をクローンします。それは描かれ、更新されなければならないので... ...私は各アルファをいくつか追加したいと思います。敵であり、私は敵のベクトルをループするために各マイナーの最も近いアルファの敵を検索すると思っていたと思っていました..マイナーの場合は最初にチェックしてくださいアルファタイプの場合

class Enemy 
{ 
public: 
    virtual ~Enemy() {}; 
    virtual Enemy* clone() = 0; 
... 
    virtual void draw(); 

... 
    void update(std::vector<Enemy*>& enemies); 

と...

void Enemy::update(std::vector<Enemy*>& enemies) { 
    Enemy* closestAlpha = nullptr; 
    for (int i = 0; i < enemies.size(); i++) { 
     if (enemies[i]->getType() == eType::MINOR) { 
      //Find the closest alpha 
      closestAlpha = getNearestAlpha(enemies); 

      // If we found a alpha, move towards him and join him 
      if (closestAlpha != nullptr) { 
       // Get the direction vector twoards the alpha 

      } 
     } 
    } 


} 

と...

Enemy* Enemy::getNearestAlpha(std::vector<Enemy*>& enemies) { 

Enemy* closestAlpha = nullptr; 
     float smallestDistance = 9999999.0f; 

    for (int i = 0; i < enemies.size(); i++) { 


} 
} 

私は、この更新機能を使用している場合でも、私はのためのループで何もしないので、私のFPSは5 fpsに低下この更新機能がなければ、私は60を望んでいます。

/********************** **********************解決しよう******/ は、リリースモードを使用し、デバッグしないで解決しました... 1000個以上のオブジェクトをカウントする

+1

あなたは「敵」を反復して型を比較してから、すべての「敵」をもう一度反復しています。これは非常に高額に見えます。アルファとは何ですか?これはタイプですか?もしあなたが最初にベクトルをフィルタリングする必要がある場合、あなたは何をしようとしているかをもっと説明する必要があります – EdChum

+0

高価かもしれませんが、ただのループですか?私は2つのタイプの敵、未成年者、そしてアルファを持っています。それぞれの未成年者に彼らの距離に応じていくつかの未成年者を追加したいと思います....すべてが敵です。私は各マイナーに最も近いアルファ敵を探索しています。敵 – Ingenious

+2

ゲームを推測したくない場合は、プロファイラを使用してください。 –

答えて

0

敵を保持してフィルタリングするための別のクラスを作成することを検討してください。

// Just cause I can't be bothered to write std::vector.... all the time. 
typedef std::vector<Enemy*>* enemyVector; 

class AllEnemies 
{ 
public: 
... 
    // Checks Enemy's type and adds it to apropriate vector; 
    void addEnemy(Enemy* e); 
    enemyVector getMinors() 
    enemyVector getAlphas() 
... 
private: 
    enemyVector m_minors; 
    enemyVector m_alphas; 
}; 

また、データモデルを変更する必要があります。この種の問題に対処する際には、通常、ある種の空間分割が使用されます。 チェックアウトNearest neighbor searchR-Tree

関連する問題