【问题标题】:Efficient Collision detection for polygons (fleet) on AndroidAndroid 上多边形(舰队)的高效碰撞检测
【发布时间】:2015-06-28 22:56:33
【问题描述】:

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

到目前为止,我的策略是使用我自己编写的 PM QuadTree 来存储每个多边形的每个段。一个多边形是一艘船的碰撞箱。

我清除每一帧并将所有段添加回四叉树中。每个段都引用了它所属的船。当我添加一艘船时,我会根据与节点边界的交集将它递归地添加到四叉树的节点中。

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

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

我的实现是否有问题(不应该这么慢?)或者我应该使用其他策略进行碰撞检测?我曾考虑每 5 帧清除一次四叉树,但这会使检测变得不精确。

我测量到,在我的 android 上计算交集的一些简单数学运算最多需要 50 次,但我不知道为什么。当然,我的手机 CPU 不会比我的笔记本电脑慢 50 倍,是吗?

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

【问题讨论】:

  • 在转向 Libgdx 之前,我已经对 Android 上的 openGL 和 FPS 进行了大量研究,但是使用 OpenGL 的所有东西都有一个问题:OpenGL 绘图强制垂直同步。您无法获得比屏幕更新间隔更快的帧速率。所以你被困在 30 或 60 帧(虽然有些可能更高)。这就是 delta 的用途,以在不同的帧速率上准确地获得诸如加速度之类的东西。这不是问题的答案,但我的观点是,除非显示器的显示更新频率为 100,否则您无法在手机上获得 100 FPS(此处不记得单位)

标签: android libgdx collision-detection


【解决方案1】:

我相信在平衡数据集的平均情况下,四叉树上的插入时间应该是 O(lg n),在最坏的情况下应该是 O(n)。因此,通过在每帧执行 O(n lg n) 或 O(n2) 操作时重建四叉树。

对于视频游戏数据,这可能会浪费大量计算,因为通常您的实体将逐帧定位在同一位置或附近位置;也就是说,它们在树中的位置不太可能改变。

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

【讨论】:

  • 我想过这一点,但它应该是一个足够快的移动 rts 并且通常每个片段都在移动。我觉得优化会很好,但不能按照我的需要加快 50 倍。谢谢你的回答。
  • 我认为这是有道理的。如果每帧只有 2% 的片段离开叶子,它可以让你的速度提高大约 50 倍。您是否尝试过计时单个插入?如果第一个需要 1 毫秒,而最后一个需要 80 毫秒,这可能是一个很大的线索。
  • 我要试试。但是你将如何实现它?一个段不只包含在一个叶子中。在大多数情况下,它跨越多个叶子。检查它是否还在一片叶子中并不足以说它没有移动。我可以检查与叶子边界的新交叉点,但它可能很昂贵。另外,您认为我可以找到一种通过使用父节点信息来加快重新插入的方法吗?
猜你喜欢
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-24
  • 2013-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多