Android上多边形(车队)的高效碰撞检测

时间:2015-06-28 22:56:34

标签: android libgdx collision-detection

我正在尝试使用libgdx为Android制作RTS。我希望能够进行碰撞检测,以便能够探测武器范围内的船只以及我的子弹与船只之间的碰撞。

到目前为止,我的策略是使用PM QuadTree,我自己编码存储每个多边形的每个部分。多边形是船舶的命中箱。

我清除每一帧并将所有段添加回四叉树中。每个细分都有对其所属船舶的引用。当我添加一艘船时,我会基于与节点边界的交集将其递归地添加到四叉树的节点。

检测碰撞是通过轮询矩形内的每个多边形来完成的,该矩形会查看完全或部分适合矩形内部的每个节点。

我的问题是每帧添加每艘船都会给Android带来不好的结果。在桌面上它足够快但在Android上它可能需要100毫秒才能添加大约200个段。

我的实现是否有问题(它不应该这么慢?)还是应该使用其他策略进行碰撞检测?我想过每5帧清除四叉树,但它会使检测不准确。

我已经测量过一些简单的数学运算来计算交集在我的机器上需要多达50次,我不知道为什么。当然我的手机CPU不比我的笔记本慢50倍,是吗?

编辑:这是一个足够快速移动的RTS。通常整个舰队都在移动,因此每个部分都在移动。在这种情况下,它不会加快我的插入速度。我需要一致的加速度大约50或100来获得每秒100帧。

1 个答案:

答案 0 :(得分:1)

我认为四叉树上的插入时间在平衡数据集的平均情况下应为O(lg n),在最坏的情况下应为O(n)。因此,每当你每帧进行O(n lg n)或O(n 2 )操作时重建四叉树。

对于视频游戏数据,这可能是大量浪费的计算,因为通常你的实体将被定位在相同位置或相邻位置的帧到帧;也就是说,他们在树上的位置不太可能改变。

我尝试的第一个优化是在树上添加一个传递来查找不再正确位于树中的片段,删除它们,然后重新插入树中。当需要移动的段数很少时,这将节省您的时间;当它很大时,额外通行证的成本与你的重新插入成本相比会很小。