JavaFX 流量模拟转换

标签 java multithreading javafx

我正在尝试为大学项目构建交通模拟。 已经实现了交通灯逻辑,动态控制所有交通灯等...... 我坚持添加车辆作为路径过渡节点。 如果我添加很多它们,每个都有自己的boundsInParentProperty更改监听器:

-与其他车辆碰撞以使它们分开

-交通灯前的区域,红灯亮时可以 parking

然后我会进行大量计算,这将使动画不流畅,应用程序变得无响应。

我猜测转换需要成为主 javafx ui 线程的一部分,那么监听器呢? 感谢任何有关选择正确方法的帮助

最佳答案

线程的规则是:

  1. 作为场景图一部分的节点的任何属性都必须是 由 FX 应用程序线程访问。
  2. 避免在 FX 应用程序线程上进行任何不必要的计算。

显然,您所处的情况很难管理,因为冗长的计算涉及必须在 FX 应用程序线程上访问的属性。

javafx.concurrent 包和 javafx.animation 包有许多工具可以简化线程管理。具体来说,有许多回调定义了在 FX 应用程序线程上执行的区域。

节点修改其属性,并因此在 FX 应用程序线程上执行任何更改监听器的方法。转换会更新它们在 FX 应用程序线程上操作的属性的状态,并对 setOnFinished(...) 等回调执行相同的操作。在javafx.concurrent API中,Task类有一个call(...)方法,该方法旨在在后台线程上执行,并且有各种回调方法(updateMessage(...), updateProgress(...)),以及一些处理程序:setOnSucceeded(...) 等,全部在 FX 应用程序线程上执行。

对于这样的模拟,我建议查看 AnimationTimer 。它有一个 handle() 方法供您实现,该方法为每个渲染帧调用一次。它接收一个 long 参数,该参数是以纳秒为单位的时间戳。 JavaFX 的目标帧速率(当前)为 60fps,因此您应该瞄准此处执行速度相当快的代码,否则您会降低帧速率,但实际上您可以在 16ms 内完成很多工作。

Here是使用此技术的一个示例。这只是模拟了很多球在盒子里弹跳,但它会给你一个想法。我还有一个版本,其中每个球都实现了自己的AnimationTimer来检查墙壁碰撞,然后还有另一个AnimationTimer来检查球与球的碰撞;性能几乎相同(这并不奇怪)。我还在未完成的《太空入侵者》模拟中使用了“每个对象的动画帧”方法,效果非常好。

关于JavaFX 流量模拟转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23094605/

相关文章:

android - 服务和多线程调用

performance - 为什么我的 Perl 脚本在使用线程时解压缩文件的速度变慢?

JavaFX 访问 Controller 给出空指针异常

java - 使用 JDBC 连接到 Openshift 数据库

java 如何让一个矩形随时间移动

java - 无法使用通用 lambda 解析重载方法

java - 如何获取 Java.exe/jvm.dll 的符号文件以分析崩溃核心转储文件?

java - 在 Android 中获取 ArrayList 项目的旧位置

c - 从线程内增加全局计数器变量,而无需等待每个单独的线程

javafx:如何设置 ScheduledService 以随机时间间隔重新启动?