首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在对象在QuadTree中移动之后更新C++?

如何在对象在QuadTree中移动之后更新C++?
EN

Stack Overflow用户
提问于 2015-07-15 21:35:38
回答 2查看 4.3K关注 0票数 4

最简单的方法是删除和插入对象,但可能有更快的方法。(如果我想得太多了,我应该用简单的方法去做,请告诉我)

这里有一些关于我的QuadTree的笔记

  • 移动的对象是are,并且可能比最小的QuadTree节点更大。
  • 在创建子QuadTrees时,对象不会被删除。这意味着根QuadTree有一个指向QuadTree中每个对象的指针。
  • 这些对象作为指针存储在QuadTree之外的向量中。

到目前为止,每次对象移动时,它都会调用根QuadTree上名为Update()的函数。在参数移动之前,它包括自己和过去的边界框。不过,我不知道怎么做这个功能。

在这里将整个代码发布到我的QuadTree中会使我的文章很长,所以我创建了一个GitHub存储库,以便于阅读。

编辑:对于任何寻找答案的人来说,似乎是通过删除和删除对象来更新对象的,从他在评论中所做的测试判断它们是非常有效的。

EN

回答 2

Stack Overflow用户

发布于 2015-07-30 19:55:29

很难做得比删除和重新插入更好,特别是在您的情况下,因为:

  • 删除似乎非常便宜(从相应节点的向量中删除指针)
  • 在查找要将对象移动到哪个节点时,需要以与插入时完全相同的方式遍历树,然后:
  • 插入很便宜

如果性能确实是一个问题,我会尝试的唯一一件事就是从叶子中插入一些东西。假设您的树非常大,并且对象通常移动到相邻的节点,您可以请求插入父节点,如果需要,它将传递给其父节点。类似于:

代码语言:javascript
复制
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);
}

基本上,从对象来自的叶子走树可能比从根开始的效率更高,因为相邻的节点倾向于共享一个相近的祖先。

在更糟糕的情况下,您将完成两倍的工作,因为您将一直返回到根。在最好的情况下,源和目标共享一个直接父级。

这将完全取决于特定树的布局、它的大小以及一系列其他因素,因此您应该在实现类似的东西之前和之后度量代码的性能。

票数 3
EN

Stack Overflow用户

发布于 2015-07-30 19:37:10

有几种解决方案:您可以在每次更新时重新创建整个树。您还可以在对象移动时简单地删除和插入对象。

另一个解决方案(在我的例子中它给了我最好的性能)是只在四叉树中存储静态对象。我将动态objcts存储在列表中(在我的游戏中,动态对象比静态对象少得多)。

此外,您还可以阅读其他空间数据结构,比如网格,在单元格之间移动对象要简单得多。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31441570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档