JavaFX 平滑动画

GGr*_*rec 1 java javafx javafx-2 javafx-8

所以我有这个Timeline自定义动画。节点转换无关紧要。

final KeyValue kv1 = new KeyValue(angle, HALF_PI,  Interpolator.LINEAR);
final KeyValue kv2 = new KeyValue(angle, -HALF_PI, Interpolator.EASE_BOTH);

final KeyFrame kf1 = new KeyFrame(Duration.millis(0),   kv1);
final KeyFrame kf2 = new KeyFrame(Duration.millis(500), kv2);

Timeline animation = new Timeline(kf1, kf2);

animation.setRate(1);
Run Code Online (Sandbox Code Playgroud)

我的angle变量在此时间线中被修改并用于节点的转换。如您所见,在本例中rate1duration500

为了平滑转换,我猜测角度应该经历几个离散值,这些值由Interpolator.

另外,我不倾向于使用 aTask来实现这一点。仅当延迟远小于使用Timeline.

问题:

哪种调整可以使动画更加平滑?

A.rate+ 高duration
B.rate+ 低duration
C. ??? 其他

Jam*_*s_D 5

速率不是帧速率。这些设置都不会影响动画的流畅度。使用任务不会有帮助:动画 API 只是一种高级机制,用于更新每个帧渲染上的 UI 属性,以相对于时间插值的方式。如果您将工作放入任务中,则无论如何都必须更新 FX 应用程序线程上的属性,因此您只需复制动画 API 为您提供的代码。

在幕后,JavaFX 有一个线程将帧渲染到图形系统。目标帧速率(当前)为 60fps。在每个帧渲染时,渲染线程必须与 JavaFX 应用程序线程同步,因此如果您在该线程上做太多工作,帧速率将低于 60fps。

我认为动画的工作原理如下:在每个帧渲染时,任何正在运行的动画都将通过沿关键帧之间的时间线插值来更新其关联的属性。基本算法非常明显:查看当前时间,减去开始时间,除以结束时间和开始时间之间的差值,使用该值来更新属性。

速率所做的只是充当插值器的乘数。因此,如果设置rate=-1,动画将向后运行。如果设置rate=2,它将在指定持续时间的一半内完成。如果您设置速率=-0.5,它会在指定持续时间的两倍内完成,并向后运行,等等。帧速率仍然是底层 FX 实现可以从系统中挤出的任何值,最高可达最大值(在当前的情况下)实现)60 fps。

平滑度基本上受到帧速率的影响(同样,您对此的唯一控制是确保您不会用太多工作淹没 FX 应用程序线程)以及每帧获得的运动量。非常快的动画将涉及每帧移动相当大距离的物体,并且看起来不如每帧移动几乎不可察觉的距离的物体平滑。