我需要提高程序的效率,并使用探查器将问题缩小到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;
}
答案 0 :(得分:0)
如果您经常这样做,请考虑维护另一个列表,或者也许是平衡的字符树-按您要查找的条件排序。
实际上,您可能拥有一个主要的字符列表,并且在该列表中具有多个不同的视图或索引,每个视图或索引对于查询有关它们之间的关系的最佳查询。
关系数据库通常使用表(甚至多个表)的索引来执行此操作,以加快涉及特定字段的查询。这个想法是,当您添加字符时,创建索引的开销很低。而且,您可能只添加了1000个字符-已建立索引,但是在玩游戏时,您可能会问有关该关系的问题数千次。