为什么我的四叉树没有提高性能?
我有一个 boids 植绒模拟设置。它最初的工作原理是让每个 boid 循环遍历每个 boid,以便它们都不断地知道彼此的位置,以便判断它们是近还是远,但后来我切换到四叉树设计,以便 boid 只需要遍历实际上就在附近的 boid。然而,它几乎没有对模拟的 FPS 做出任何改进。就好像我还在遍历每一个 boid。
我的实现有什么错误吗?Repo 在这里,相关代码主要在 main.js、quadtree.js 和 boid.js 中。现场直播在这里
回答
您没有看到 Quadtree 的明显性能提升的原因是模拟的性质。目前,默认的分离会导致大量的群体“收敛”到同一个位置。
由于空间分区,同一位置的许多对象将抵消可能的加速。如果所有对象都处于相同或接近的位置,则该区域中的 boid 将强制检查该区域中的所有其他 boid。
您可以通过使用默认设置观察或分析您的应用程序来向自己证明您的 Quadtree 正在工作。现在将分离度调到最大。您将在视觉上或通过分析看到,随着 boid 分布得更均匀,FPS 显着增加。这是因为四叉树现在可以通过其空间分区来防止计算。
默认低分离:
最大分离:
您可以在第二张图片中看到性能是如何提高的。另请注意,另一位评论者关于四叉树 ( insert)的构造一直在占用的猜想是错误的。
虽然在某些应用程序中,您可能能够随着事物移动而更新四叉树,因为在此模拟中,每个组成部分都在每一帧移动,因此从头开始重建四叉树的工作较少,然后取出每个对象并将其重新插入到新位置。
跳过平方根并只使用距离平方的建议很好,因为这会让你获得更多的性能。