【问题标题】:Quadtree Performance: Square vs. Rectangular?四叉树性能:方形与矩形?
【发布时间】:2018-03-18 04:15:43
【问题描述】:

对于我正在编写的游戏,我在非方形地图上使用四叉树。四叉树用于在给定的最大值内查找相邻单元以进行碰撞检测、要攻击的敌人、最近的基地等。半径(圆)。

我想知道的是,如果使用由矩形而不是正方形组成的四叉树存在性能问题?不是将正方形地图划分为正方形,而是将矩形地图划分为四叉树中大小相等的矩形。

矩形地图上的方形四叉树:将创建一个四叉树填充整个地图,但左侧或底部有空白/未使用区域,具体取决于地图的方向(水平与垂直) .这将需要更多的填充方块 (?) 并且可能在搜索期间也对性能产生影响?

与矩形地图匹配的矩形四叉树:四叉树将完美地填充地图。但是,这样做会影响性能吗?鉴于我们搜索使用的半径适合正方形而不是矩形,它可能会导致搜索速度变慢?此外,宽度和高度都必须存储在每个四叉树节点中,因为它们是非正方形的。

问题: 将四叉树转换为正方形更好吗?我认为使用矩形小队可能没问题,但我不确定?

屏幕截图(矩形四叉树)

【问题讨论】:

  • 只要你能很容易地计算出边界就没有关系了,也就是说,当一个对象处于某种形状时。这对于任何矩形(包括正方形)都是微不足道的。圆圈也很容易(但用圆圈覆盖整个地图并不容易)。三角形也很可行(显卡在这方面进行了超级优化)。矩形形状的好处是您可以轻松地将它们划分为其他矩形,您需要获得log n

标签: performance quadtree


【解决方案1】:

我确定这两个选项都可以。从您的示例来看,您的数据集看起来也很小,只有几十个条目,也许有 100 个?

需要考虑的一些事项:

  • 正如您所提到的:矩形需要单独的 x 和 y 的“长度”。影响可能很小,但每增加一点信息都会减慢结构的速度,因为必须将更多数据移动到 CPU 并通过 CPU。
  • 如果您在四叉树中存储(通常)直接位于矩形边框上的对象,则需要小心正确地实现四叉树:
    • 插入:在四个象限的拐角处插入一个项目,它插入到哪个位置?
    • 查询/查找:与插入相反,任何以边界结束的搜索都可能(不必要地搜索所有边界 qaudrants,这可能会很昂贵。

总之,这个问题可能不是关于方形/矩形四叉树的问题,但是当数据经常位于象限边界上时应该小心。

【讨论】:

  • 会有几百个对象。是的,显然象限的边界不重叠,所以添加很好。但是,想想看,是的,如果没有给出半径,靠近边界/角落的点将使搜索变得非最优。我将添加一个优先队列进行搜索!
  • 听起来你同意我的观点,我重复一遍以防万一:小心说“象限不重叠”:如果一个象限有 (0,0) 到 (1, 1) 和另一个象限 (0,1) 到 (1,2),那么点 (0,1) 或 (0.5,1), ... 位于哪个象限?所以象限很容易重叠,除非你总是将它们的角坐标之一指定为“独占”。使用浮点值(舍入误差等......)很难做到这一点。
  • 不用担心,我将第二个角用作“专有”,因此毫无疑问必须将元素放置在哪里:)
猜你喜欢
  • 1970-01-01
  • 2013-05-12
  • 1970-01-01
  • 2020-09-24
  • 1970-01-01
  • 2017-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多