【发布时间】:2011-10-22 05:39:09
【问题描述】:
在我的 2D 游戏中,我有静态和动态对象。可以有多个摄像头。我的问题:确定与当前相机的视图矩形相交的对象。
目前,我只是遍历所有现有对象(不关心动态或静态),并使用相机视图对它们进行 AABB 检查。这对于非常动态的对象似乎是可以接受的,但对于可能有数万个静态对象(散布在整个场景中的静态关卡几何体)来说却不是这样。
我研究了多种可以解决我的问题的数据结构:
- 四叉树
这是我考虑的第一件事,但问题是它会强制我的场景为固定大小。 (静态对象可以接受,动态对象不行)
- 动态 AABB 树
看起来不错,但重新平衡的开销对于许多动态对象来说似乎太大了。
- 空间散列
对我来说,这里的主要问题是,如果你用相机缩小很多,必须查询大量几乎不存在的空间哈希桶,导致性能低下。
总的来说,我对这个问题的良好解决方案的标准是:
动态大小:解决方案不得导致场景大小受到限制,或需要大量重新计算以调整大小
良好的查询性能(针对相机)
对动态对象的良好支持:处理位置不断变化的对象所需的计算应该很好:
我的游戏中动态对象的最大合理数量可能是 5000 个。考虑到它们每帧都会改变它们的位置。考虑到频繁的插入和删除,是否有一种数据结构可以比每帧用相机比较对象的 AABB 更快?
【问题讨论】:
-
“固定大小”是什么意思?
-
@Cicada:创建四叉树时,需要设置根节点的大小。更改根节点大小的成本很高,因为它涉及重建整个树,并且您可能不想在某些小对象离开根节点区域时这样做。我认为这就是他所说的“固定大小”的意思。
-
为什么空间散列对您来说不够好?我知道至少有 2 条空间填充曲线和 6 种有用的变体。我最喜欢的是希尔伯特曲线。你能解释一下你的问题吗?我已经更正了我的答案,因为我知道 1 条曲线很难制作(摩尔曲线)。
-
@Cicada:也许他的意思是树的高度?但这不是固定的。
-
Jitamaro:他的意思是根节点的大小,我确定
标签: 2d spatial quadtree culling occlusion