2016-04-15 10 views
0

Ich entwickle ein kleines Spiel und möchte meine C++ polieren und deshalb verwende ich alle, Lust Entwurfsmuster ich finden kann;)Leistungsproblem, Stack, Heap oder Prototypmuster?

jetzt also gehe ich davon aus ich das falsche Muster verwenden, weil ich schwere Performance-Probleme haben,

Ich benutze das Mustermuster für meine feindliche Klasse, die dann verschiedene Gegner klont, die gezeichnet und aktualisiert werden müssen .... also ... ich möchte jedem Alpha einige Minderjährige abhängig von deren Entfernung zufügen ... also alle sind Feinde und ich dachte, dass ich für jeden Minor den nächsten Alpha-Feind suche, um meinen Vektor von Feinden zu schleifen .. zuerst für einen Minderjährigen und wenn ich einen Minderjährigen habe, suche ich nach dem nächsten Alpha durch nochmaliges Looping durch die for-Schleife für Alphatypen

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

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

und ...

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 

      } 
     } 
    } 


} 

und ...

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

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

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


} 
} 

Also, wenn ich diese Update-Funktion verwenden, auch ich nichts in dem for-Schleife zu tun, fällt mein fps bis 5 fps und ohne diese Updatefunktion habe ich meine Wunsch 60 bekommen.

/********************** GELÖST ********************** ******/ gelöst durch Verwendung von Release-Modus und nicht debuggen ... Zählen jetzt über 1000 Objekte

+1

Sie iterieren über "Feinde" und vergleichen Typ und dann wieder über alle "Feinde", das scheint sehr teuer. Was ist ein Alpha? Ist das ein Typ? wenn ja, solltest du den Vektor zuerst filtern, du musst mehr erklären, was du versuchst – EdChum

+0

Könnte teuer sein, aber es ist nur eine for-Schleife? Ich habe zwei Arten von Feinden, Minderjährige und Alphas, ich will jeden alpha einige der Kinder und Jugendlichen, um sie abhängig von ihrer Entfernung anhängen .... so sind alle Feinde Ich dachte, ich für jeden kleineren Feind die nächste Alpha suchen, indem zum Einschleifen mein Vektor Feinde – Ingenious

+2

Sofern Sie nicht gerne Spiele raten, verwenden Sie einen Profiler. –

Antwort

0

Erwägen Sie das Erstellen einer separaten Klasse zum Halten und Filtern Ihrer Feinde.

// 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; 
}; 

Sie sollten auch Ihr Datenmodell ändern. Bei diesen Problemen wird normalerweise eine Art räumlicher Partitionierung verwendet. Schauen Sie sich und R-Tree

Verwandte Themen