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