四叉树性能问题

时间:2017-01-17 00:36:15

标签: performance quadtree

我遇到的问题是我使用的游戏使用四叉树进行快速接近检测,用于武器射击时的范围检查。我正在使用经典的“4宽”四叉树,这意味着当我尝试将第5个子节点添加到已经完整的父节点时,我会细分。

最初可用目标的集合相当均匀,因此四叉树的效果非常好。由于设计的变化,我们现在在相对较小的空间内聚集了大量的敌人,导致性能问题,因为四叉树变得非常不平衡。

我有两种可能的解决方案,要么修改四叉树来处理这个问题,要么切换到替代表示。

我熟悉的唯一其他表示是空间哈希,对此并不十分熟悉。根据我的理解,这可能会遇到同样的问题,因为群集会在相对较少的散列桶中结束。据我所知,BSP是一种可能的解决方案,可以比四叉树或空间散列更好地处理不均匀分布。

不公平,我知道,现在实际上有三个问题。

  1. 我可以对四叉树进行任何修改,例如增加节点的“宽度”有助于解决这个问题吗?

  2. 是否值得花些时间考虑空间哈希?

  3. BSP或其他一些数据结构是否可以更好地应对不均衡的分布?

1 个答案:

答案 0 :(得分:0)

我通常使用每个节点至少有10个条目的四叉树,但你必须尝试一下。

我没有空间哈希的经验。

您可以研究的其他结构是:

  • KD-Trees:它们实现起来非常简单,也适用于邻居搜索,但字符串聚类速度较慢。它们更新有点慢,可能会失去平衡。
  • R * Tree:更复杂,非常适合邻居搜索,但更新甚至比KD-Trees更慢。由于自动重新平衡,它们不会失衡。重新平衡的速度通常很快,但在极端情况下,它可能偶尔会使事情进一步减缓。
  • PH-Tree:实施起来相当复杂。好邻居搜索。具有非常好的更新速度(如四叉树),最大深度受坐标位宽(通常为32或64位)的限制,因此它们无法真正获得不平衡。使用大型数据集(100万或更多)可以很好地扩展,我对小数据集的经验很少。

如果您使用的是Java,我可以使用Apache许可版本here (R*Tree)here (PH-Tree)