我正在编写一个小游戏并想要改进我的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个对象
答案 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 search和R-Tree