微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决为什么我的四叉树没有提高性能?

我有一个 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)的构造一直在占用的猜想是错误的。

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?