最简单的方法是删除和插入对象,但可能有更快的方法。(如果我想得太多了,我应该用简单的方法去做,请告诉我)
这里有一些关于我的QuadTree的笔记
到目前为止,每次对象移动时,它都会调用根QuadTree上名为Update()的函数。在参数移动之前,它包括自己和过去的边界框。不过,我不知道怎么做这个功能。
在这里将整个代码发布到我的QuadTree中会使我的文章很长,所以我创建了一个GitHub存储库,以便于阅读。
编辑:对于任何寻找答案的人来说,这似乎是通过删除和删除对象来更新对象的,从他在评论中所做的测试判断它们是非常有效的。
发布于 2015-07-30 19:55:29
很难做得比删除和重新插入更好,特别是在您的情况下,因为:
如果性能确实是一个问题,我会尝试的唯一一件事就是从叶子中插入一些东西。假设您的树非常大,并且对象通常移动到相邻的节点,您可以请求插入父节点,如果需要,它将传递给其父节点。类似于:
void insert_from_leaf(object* o) {
if (!is_in_this_subtree(o)) {
parent->insert_from_leaf(o);
return;
}
find_child_node_for_object(o)->insert(0);
}基本上,从对象来自的叶子走树可能比从根开始的效率更高,因为相邻的节点倾向于共享一个相近的祖先。
在更糟糕的情况下,您将完成两倍的工作,因为您将一直返回到根。在最好的情况下,源和目标共享一个直接父级。
这将完全取决于特定树的布局、它的大小以及一系列其他因素,因此您应该在实现类似的东西之前和之后度量代码的性能。
发布于 2015-07-30 19:37:10
有几种解决方案:您可以在每次更新时重新创建整个树。您还可以在对象移动时简单地删除和插入对象。
另一个解决方案(在我的例子中它给了我最好的性能)是只在四叉树中存储静态对象。我将动态objcts存储在列表中(在我的游戏中,动态对象比静态对象少得多)。
此外,您还可以阅读其他空间数据结构,比如网格,在单元格之间移动对象要简单得多。
https://stackoverflow.com/questions/31441570
复制相似问题