性能问题,堆栈,堆或原型模式?

时间:2016-04-15 08:09:23

标签: c++ design-patterns prototype

我正在编写一个小游戏并想要改进我的c ++,因此我使用我能找到的每个花哨的设计模式;)

所以现在我假设我使用了错误的模式,因为我遇到了严重的性能问题,

我为我的敌人类使用原型模式,然后克隆不同的敌人,必须绘制和更新....所以......我想在每个alpha附加一些未成年人依赖于他们与他们的距离....所有都是敌人,我想我搜索每个未成年人的最小的敌人是为了循环我的敌人矢量..。第一次为未成年人,如果我有一个未成年人我通过循环再次循环寻找最近的阿尔法检查alpha类型

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++) {


}
}

所以如果我使用这个更新功能,即使我在for循环中什么都不做,我的fps下降到5 fps,没有这个更新功能,我得到了我想要的60。

/ **********************解决*********************** ***** / 通过使用发布模式解决而不是调试...现在计算超过1000个对象

1 个答案:

答案 0 :(得分: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