寻找最近的移动 "敌人 "最有效的方法是什么?[不公开]

问题描述 投票:0回答:1

我见过一些类似的问题,但他们更多的是集中在比较两种不同的方法,而不是在更普遍的意义上问。

但是,当 "敌人 "和当前玩家NPC也可以自由移动时,寻找最近的 "敌人 "的最有效方法是什么?

如果敌人的位置是静态的,我想最有效的方法是根据敌人的位置进行排序列表,然后用二进制搜索算法来寻找最近的敌人。然而,由于它们是移动的,我唯一能想到的解决方案是一个简单的for循环,迭代每一个敌人,并比较距离最近的距离,运行时间为O(n)。

这并不理想,尤其是在两队都有多个实体的情况下。假设A队有100个实体,B队有100个实体,所有实体都不是用户控制的。这意味着团队A上的每个实体将每隔x秒迭代一次团队B上的所有实体,反之亦然。这意味着每x秒要进行20000次比较(如果我没有算错的话)。

我没有任何代码可以分享,因为这更多的是一个一般性的问题,但是几年前我在做一个非常简单的游戏时确实使用了for循环的方法,对于少量的实体来说,它工作得很好,但是我相信我注意到了大约30-40个实体的性能问题。

感谢任何帮助。

performance search closest
1个回答
0
投票

你所要解决的问题看起来像一个? 近邻搜索正体模拟.

如果你考虑到一个问题,在那里你需要找到的是 列表中最近的元素那么你需要对所有的元素进行迭代。因此,由此产生的复杂性是 O(n). 你不能做得更好,因为你需要读取整个输入(n个元素)。

如果你考虑这样的情况,你想 找出最接近的元素 元素 在一个给定的n个元素的列表中,你可以用比测试所有可能的距离更快的方式来做这件事(复杂度为 O(n^2)). 常见的解决方法是将所有的元素放在一个 BSP-树 数据结构 Quadtree八角树. 这样的数据结构可以帮助你定位在一个 O(log(n)) 时间。因此,这种方法的整体复杂度是 O(nlog(n))!

请注意,更新一个元素在BSP树中的位置最多需要 O(log(n)) 操作。因此,更新n个元素的计算方式为 O(nlog(n)) 的时间。这比单纯更新n个元素的位置(在 O(n)),但还是比较便宜的!

© www.soinside.com 2019 - 2024. All rights reserved.