【问题标题】:Why has my quadtree made no improvement to performance?为什么我的四叉树没有提高性能?
【发布时间】:2021-07-24 19:48:14
【问题描述】:

我有一个 boids 植绒模拟设置。它最初的工作原理是让每个 boid 循环通过每个 boid,以便它们都不断知道彼此的位置,以便判断它们是近还是远,但后来我切换到四叉树设计,这样 boid 只需循环通过实际上在附近的生物。但是,它对模拟的 FPS 几乎没有任何改进。就好像我还在循环遍历每一个 boid。

我的实现中是否有一些错误? repo 为here,相关代码主要在main.js、quadtree.js、boid.js。直播网站是here

【问题讨论】:

  • 那么...如果小虫子在移动,您必须为每一帧重新创建四叉树吗?
  • 正确,我每帧都重新创建四叉树。
  • @Ouroborus 你知道有什么方法可以很好地处理像boids这样的移动物体吗?
  • @Ouroborus - 为了正确起见,我认为您的意思是说使用距离平方而不是距离会删除 SQRT 操作,对吗?
  • @Ouroborus 你提到四叉树每帧都在构建,这否定了它的用处;我不认为这是真的。对于单个帧,如果将所有内容放入四叉树中,由于四叉树的空间划分,每个 boid 将不得不对该帧进行较少的邻居检查。问题是邻居检查的节省是否超过了四叉树的构建。如果你分析他的代码,你会发现你的赌注是错误的。绝大多数时间都花在查询四叉树上,而四叉树的构造相对来说微不足道。

标签: javascript complexity-theory quadtree boids


【解决方案1】:

您没有看到四叉树的明显性能提升是因为您的模拟的性质。目前,默认分离会导致大量 boid “收敛”到同一位置。

由于空间分区,同一位置的大量对象将抵消可能的加速。如果所有对象都在相同或接近的位置,则该区域中的 boid 将强制检查该区域中的所有其他 boid。

您可以通过使用默认设置观察或分析您的应用程序来向自己证明您的 Quadtree 正在工作。现在将分离调到最大。您会在视觉上或通过分析看到,随着 boid 分布得更均匀,FPS 显着增加。这是因为四叉树现在可以通过空间分区来阻止计算。

使用默认低分离:

最大分离:

您可以在第二张图片中看到性能是如何提高的。另请注意,另一位评论者的猜想是四叉树 (insert) 的构造一直在占用是错误的。

虽然在某些应用程序中,您可能能够在事物移动时更新四叉树,因为在此模拟中,每个组成部分都会移动每一帧,从头开始重建四叉树较少工作,然后获取每个对象将其重新插入新位置。

建议跳过平方根而只使用距离平方是很好的,但这样可以提高性能。

【讨论】:

  • 出色的分析。基本上没有什么改善,因为是BOIDS!
猜你喜欢
  • 2013-05-12
  • 1970-01-01
  • 1970-01-01
  • 2017-01-09
  • 1970-01-01
  • 2012-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多