有一点背景知识,我正在和一个C ++的朋友一起编写一个演化游戏,使用ENTT作为实体系统。生物在2D地图中四处走走,吃些绿色或其他生物,繁殖并改变其特性。
此外,当实时运行游戏时,性能还不错(60fps没问题),但我希望能够显着加快速度,而不必等待4小时即可看到任何重大变化。所以我想尽快得到它。
我正在努力寻找一种有效的方法来让生物找到食物。每个生物都应该寻找最接近它们的最佳食物。
如果要吃东西,应该以中心位置为中心的生物以149.64半径(视野距离)环顾四周,并根据营养,距离和种类(肉或植物)来判断应选择哪种食物。 。
负责查找每个生物食物的功能正在消耗大约70%的运行时间。简化当前的编写方式,它是这样的:
for (creature : all_creatures)
{
for (food : all_entities_with_food_value)
{
// if the food is within the creatures view and it's
// the best food found yet, it becomes the best food
}
// set the best food as the target for creature
// make the creature chase it (change its state)
}
此功能会在每个要寻找食物的生物的每一刻运行,直到该生物找到食物并更改状态。每当为追求某种食物的生物产生新的食物时,它也会运行,以确保每个人都在追求最好的食物。
我对如何提高此过程的效率持开放态度。我很想减少的复杂性,但我不知道那是否有可能。
我已经改善它的一种方法是对all_entities_with_food_value
组进行排序,以便当一个生物在无法食用的食物上迭代时,它就停在那里。任何其他改进都值得欢迎!
编辑:谢谢大家的答复!我从各种答案中实现了各种东西:
首先,我只是简单地做到了这一点,因此罪恶感功能每五个滴答声仅运行一次,这使游戏速度提高了约4倍,而看不到任何有关游戏的变化。
之后,我在食物搜索系统中存储了一个数组,该数组中产生的食物与运行时相同。这样,我只需要将生物追逐的食物与出现的新食物进行比较即可。
最后,在研究了空间划分并考虑了BVH和四叉树之后,我选择了后者,因为我觉得它更简单并且更适合我的情况。我很快实施了它,并极大地提高了性能,寻找食物几乎不需要任何时间!
现在,渲染让我放慢了脚步,但这又是一个问题。谢谢你们!
if (food.x>creature.x+149.64 or food.x<creature.x-149.64) continue;
如果性能足够,添加应该比实现“复杂的”存储结构更容易。(相关:如果您在内部循环中发布更多代码,可能会对我们有帮助)