JavaFX流量模拟转换

时间:2014-04-15 21:10:33

标签: java multithreading javafx

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

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

交通灯前面的区域,当红灯亮起时能够停止

然后我结束了大量的计算,这些计算将使动画不是ui炒,app变得反应迟钝。

我猜测转换需要成为主要javafx ui线程的一部分,那么听众呢? 任何有关选择正确方法的帮助都表示赞赏

1 个答案:

答案 0 :(得分:2)

线程规则是:

  1. 属于场景图的节点的任何属性都必须是 由FX Application Thread访问。
  2. 避免在FX Application Thread上进行任何不必要的计算。
  3. 显然,你遇到了管理难度的问题,因为冗长的计算涉及必须在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”方法,并且它运行得很好。