我正在尝试为大学项目建立交通模拟。 已经实施了交通灯逻辑,动态控制所有交通信号灯...... 我坚持添加车辆作为路径转换节点。 如果我添加了很多,每个都有自己的boundsInParentProperty更改监听器,它监听:
- 与其他车辆碰撞以使他们分开
交通灯前面的区域,当红灯亮起时能够停止然后我结束了大量的计算,这些计算将使动画不是ui炒,app变得反应迟钝。
我猜测转换需要成为主要javafx ui线程的一部分,那么听众呢? 任何有关选择正确方法的帮助都表示赞赏
答案 0 :(得分:2)
线程规则是:
显然,你遇到了管理难度的问题,因为冗长的计算涉及必须在FX应用程序线程上访问的属性。
javafx.concurrent包和javafx.animation包具有许多便于管理线程的工具。具体来说,有许多回调被定义在FX应用程序线程上执行哪个区域。
节点修改其属性,从而在FX Application Thread上执行任何更改侦听器的方法。转换更新它们在FX应用程序线程上操作的属性的状态,并对回调(例如setOnFinished(...)
)执行相同操作。在javafx.concurrent API中,Task
类具有call(...)
方法,该方法旨在在后台线程上执行,并且有各种回调方法(updateMessage(...)
,{{1} }),以及一些处理程序:updateProgress(...)
等,它们都在FX应用程序线程上执行。
对于这样的模拟,我建议查看AnimationTimer。这有一个setOnSucceeded(...)
方法供您实现,每个渲染帧调用一次。它接收handle()
参数,该参数是以纳秒为单位的时间戳。 JavaFX的目标帧速率(目前)为60fps,因此您应该针对在此处合理快速执行的代码,否则您将降低帧速率,但实际上您可以在16ms内完成相当多的工作。
Here是使用此技术的示例。这只是模拟了很多在一个盒子里蹦蹦跳跳的球,但它会给你一个想法。我还有一个版本在某个地方踢,其中每个球都实现了它自己的long
以检查墙壁碰撞,然后还有另一个动画测试器检查球 - 球碰撞;表现几乎完全相同(这并不奇怪)。我在未完成的Space Invaders模拟中使用了“每个对象的AnimationFrame”方法,并且它运行得很好。