如何提高我的查找目标函数的效率

时间:2019-04-18 01:52:09

标签: c++ performance

我需要提高程序的效率,并使用探查器将问题缩小到2个关键领域,但是我在想办法使程序更好地运行方面遇到了麻烦。

根据分析器的报告,似乎是在告诉我函数是否无效。有什么更好的方法可以达到更好的效果?

Character* FindAttackTarget() const
{
    float weakestHp = FLT_MAX;
    Character* weakestEnemy = nullptr;
    uint64_t weakestCharId = INT64_MAX;

    //Only attack characters that are within attack range
    auto& gameChars = m_pGame->m_gameCharacters;

    for (size_t i = 0; i < gameChars.size(); ++i)
    {
        auto& c = gameChars[i];
        if (Location.Dist(c.GetLocation()) <= AttackRange &&
            c.HP > 0 &&
            c.Team != Team)
        {
            //We want the weakest with the lowest ID number
            //this keeps consistent results when re-playing the same part of the game
            // (eg. after a load game)
            if (c.HP < weakestHp || (c.HP == weakestHp && c.ID < weakestCharId))
            {
                weakestEnemy = &gameChars[i];
                weakestHp = c.HP;
                weakestCharId = c.ID;
            }
        }
    }

    return weakestEnemy;
}

1 个答案:

答案 0 :(得分:0)

如果您经常这样做,请考虑维护另一个列表,或者也许是平衡的字符树-按您要查找的条件排序。

实际上,您可能拥有一个主要的字符列表,并且在该列表中具有多个不同的视图或索引,每个视图或索引对于查询有关它们之间的关系的最佳查询。

关系数据库通常使用表(甚至多个表)的索引来执行此操作,以加快涉及特定字段的查询。这个想法是,当您添加字符时,创建索引的开销很低。而且,您可能只添加了1000个字符-已建立索引,但是在玩游戏时,您可能会问有关该关系的问题数千次。