我正在javafx制作一个小型的3D物理仿真程序,我在一个单独的线程中研究了各种方法进行物理计算,但是在多线程方面经验很少,我发现很难找到计算物理的最佳方法并将它们传递给javafx应用程序
所以我的问题是
在javafx中进行背景计算的最佳方法是什么?
如何在物理线程和javafx应用程序之间同步和传递数据?
答案 0 :(得分:1)
阅读JavaFX并发文档:Concurrency in JavaFX,javafx.concurrent.Task和Platform.runLater。我不会在这里重新解释,因为您需要的所有基本信息都在官方文档IMO中。有关其他信息,您只需谷歌搜索JavaFX线程和并发,这将提出许多stackoverflow问题,提供有关此主题的更多信息。
考虑一下你是否真的需要自己的线程。可能,the physics calculations can be performed quickly on the JavaFX application thread和你自己的线程不是必需的。
它是一个多重物体的三维重力模拟> 1000,所以当我进行物理计算时,我的表现确实下降了。
您可以使用fork/join的任务并行执行计算。完成所有计算后,您可以进行Platform.runLater调用以根据更新的计算更新UI。
请注意,正确实现fork / join可能对您来说很复杂。您可能想尝试在自己的任务中运行计算,并在完成添加像fork / join之类的额外复杂性之前调用Platform.runLater。
实现我的主循环的最佳方法是如上所述我尝试了Timeline和AnimationTimer,我读过AnimationTimer应该更好但是还有其他选择吗?
正如你所述,当JavaFX线程上的所有内容完成时,性能下降太多,那么Timeline和AnimationTimer都不会帮助你在JavaFX应用程序线程上执行它们的工作。如果您愿意,可以尝试使用如上所述的Platform.runLater调用方法。