2D遮挡剔除的最佳解决方案

时间:2011-08-08 09:11:59

标签: 2d spatial quadtree culling occlusion

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

目前,我只是遍历所有现有对象(不关心动态或静态)并使用相机视图对其进行AABB检查。这对于非常动态的对象来说似乎是可以接受的,但对于静态对象来说却是不可接受的,在静态对象中可能存在数万个静态对象(静态级别几何体散布在整个场景中)。

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

  • 四叉树

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

  • 动态AABB树

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

  • 空间哈希

这里的主要问题是,如果你大量使用相机缩小,则必须查询大量不存在的空间散列桶,导致性能低下。

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

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

  • 良好的查询性能(适用于相机)

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

我的游戏中一次性动态对象的最大合理数量可能是5000.考虑它们每一帧都改变它们的位置。考虑到频繁的插入和删除,是否有一个数据结构可以更快,而不是每帧比较物体的AABB和相机?

1 个答案:

答案 0 :(得分:4)

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

  • Quad树显然适用于固定的静态几何体 界限。

  • 空间哈希非常适合具有相似尺寸的物体组 (例如粒子系统)。

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

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

  

散布在整个场景中的静态水平几何

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