与仅使用自制线程相比,使用 AnimationTimer 是不是具有性能优势?

Posted

技术标签:

【中文标题】与仅使用自制线程相比,使用 AnimationTimer 是不是具有性能优势?【英文标题】:Is there a performance advantage in using AnimationTimer over just using self made threads?与仅使用自制线程相比,使用 AnimationTimer 是否具有性能优势? 【发布时间】:2021-12-31 17:10:17 【问题描述】:

我最近从 swing 切换到 javaFX,我注意到每个人都在使用 AnimationTimer 来制作游戏循环。我的问题是使用 AnimationTimer 是否比仅使用自制线程运行游戏循环有性能优势?因为到目前为止,只创建处理游戏渲染和更新的线程是可以的,但在 javaFX 中似乎没有人这样做,所以我想知道使用自制线程是否会导致任何性能问题。

提前致谢!

【问题讨论】:

这可能是不好的做法,但我们需要查看代码。 JavaFX 和 Java 都有限制哪些线程应该访问屏幕上显示的任何 GUI 对象。如果您没有正确执行此操作,则可能会发生坏事。在 Java 中,javax.swing.Timer 会为您正确执行此操作,我猜 JavaFX 的 AnimationTimer 可能会执行相同的任务。 您可以通过使用 AnimationTimer 的示例来改进这个问题。你几乎设置了一些稻草人的论点。 “在摇摆中,只创建线程就可以了”你有一些上下文吗?您有绩效目标吗? 我会问相反的问题。如果每个知道自己在做什么的人都使用 AnimationTimer 类,那么您的动机是什么,甚至考虑不同的解决方案?您希望从这种与常规做法的偏差中得到什么改进? 【参考方案1】:

AnimationTimer 的特点是它通常会以显示刷新率运行并在 JavaFX 平台线程上执行,因此它非常适合更新游戏 UI。

但是,在 UI 线程上运行所有游戏逻辑可能不是最好的。这在很大程度上取决于您的游戏及其要求。我会考虑运行一个后台线程来计算下一个游戏状态,然后只在 AnimationTimer 回调中进行渲染。当然会增加复杂性和需要同步,因此您需要确定这在您的特定情况下是否有意义。

【讨论】:

另见AnimationTimerexample和Task动画example。

以上是关于与仅使用自制线程相比,使用 AnimationTimer 是不是具有性能优势?的主要内容,如果未能解决你的问题,请参考以下文章

与仅使用 systemd 相比,我从 JSVC 获得啥好处?

Flux Dispatcher 的目的是啥(与仅具有实例方法相比)

MPI +线程并行化与仅MPI的优势(如果有的话)是什么?

用java自制简易线程池(不依赖concurrent包)

React Hooks - 使用 useState 与仅使用变量

何时使用 UIKIT_EXTERN 与仅使用 extern