【问题标题】:Best solution for 2D occlusion culling2D 遮挡剔除的最佳解决方案
【发布时间】:2011-10-22 05:39:09
【问题描述】:

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

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

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

  • 四叉树

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

  • 动态 AABB 树

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

  • 空间散列

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

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

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

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

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

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

【问题讨论】:

  • “固定大小”是什么意思?
  • @Cicada:创建四叉树时,需要设置根节点的大小。更改根节点大小的成本很高,因为它涉及重建整个树,并且您可能不想在某些小对象离开根节点区域时这样做。我认为这就是他所说的“固定大小”的意思。
  • 为什么空间散列对您来说不够好?我知道至少有 2 条空间填充曲线和 6 种有用的变体。我最喜欢的是希尔伯特曲线。你能解释一下你的问题吗?我已经更正了我的答案,因为我知道 1 条曲线很难制作(摩尔曲线)。
  • @Cicada:也许他的意思是树的高度?但这不是固定的。
  • Jitamaro:他的意思是根节点的大小,我确定

标签: 2d spatial quadtree culling occlusion


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-06-27
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多