为什么我的四叉树没有提高性能?

问题描述

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

我的实现有什么错误吗? Repo 为 here,相关代码主要在 main.js、quadtree.js 和 boid.js 中。实时站点here

解决方法

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

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

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

默认低分离: With low separation

最大分离度: With maximum separation

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

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

跳过平方根并只使用距离平方的建议很好,因为这会给你带来更多的性能。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...