7

在我的 2D 游戏中,我有静态和动态对象。可以有多个摄像头。我的问题:确定与当前相机的视图矩形相交的对象。

目前,我只是遍历所有现有对象(不关心动态或静态)并使用相机视图对它们进行 AABB 检查。这对于非常动态的对象似乎是可以接受的,但对于静态对象则不然,因为静态对象可能有成千上万个(静态关卡几何体散布在整个场景中)。

我研究了多种可以解决我的问题的数据结构:

  • 四叉树

这是我考虑的第一件事,但问题是它会迫使我的场景具有固定大小。(静态对象可以接受,动态对象不行)

  • 动态 AABB 树

看起来不错,但是对于许多动态对象来说,重新平衡它的开销似乎太大了。

  • 空间哈希

对我来说,这里的主要问题是,如果你用相机缩小很多,必须查询大量几乎不存在的空间哈希桶,导致性能低下。

一般来说,我对这个问题的良好解决方案的标准是:

  • 动态大小:该解决方案不得导致场景大小受到限制,或需要大量重新计算以调整大小

  • 良好的查询性能(针对相机)

  • 对动态对象的良好支持:处理位置不断变化的对象所需的计算应该很好:

在我的游戏中,动态对象的最大合理数量可能是 5000。考虑到它们每帧都会改变它们的位置。考虑到频繁的插入和删除,是否有比每帧将对象的 AABB 与相机进行比较更快的数据结构?

4

1 回答 1

4

不要试图找到银弹。只需将您的场景分成动态和静态部分,并为它们使用不同的算法。

  • 四叉树显然适用于具有固定边界的静态几何。

  • 空间散列非常适合具有相似大小的对象集
    (例如粒子系统)。

  • AFAIK 动态 AABB 树很少用于遮挡剔除,它们的主要目的是广泛的碰撞检测阶段。

  • 正如您所注意到的,如果动态对象的数量不是很大,蛮力剔除对于动态对象来说是正常的。

散布在整个场景中的静态关卡几何

如果您的场景高度稀疏,您可以将其划分为岛屿,即创建一个具有“良好密度”的场景部分列表。

于 2011-11-07T07:22:11.410 回答