【问题标题】:Difference bewteen AnimationTimer vs TransitionAnimationTimer 与 Transition 之间的差异
【发布时间】:2017-05-12 03:09:38
【问题描述】:

考虑这段代码:

import java.util.ArrayDeque;

import javafx.animation.AnimationTimer;
import javafx.animation.Transition;
import javafx.application.Application;
import javafx.stage.Stage;
import javafx.util.Duration;

public class FrameTest extends Application
{
    private static final int SUBFRAMES = 1;
    private static final int FRAME_SAMPLE = 10;
    private long prevTime;
    private long frame;
    private ArrayDeque<Long> frameTimes = new ArrayDeque<>();
    private double fps;
    private int subframe;

    public static void main(String[] args)
    {
        Application.launch(args);
    }


    public void frameTick()
    {

        long time = System.nanoTime();
        if (prevTime != -1)
        {
            while (frameTimes.size() > FRAME_SAMPLE - 1)
                frameTimes.remove();
            frameTimes.add(time - prevTime);
            double fps = 0;
            for (long ftime : frameTimes)
                fps += ftime * 1e-9;
            fps = frameTimes.size() / fps;
            this.fps = fps;
            System.out.printf("%.9f\n", fps);
        }
        prevTime = time;

    }



    @Override
    public void start(Stage primaryStage) throws Exception
    {
        Transition trans = new Transition()
        {
            {
                setCycleCount(INDEFINITE);
                setCycleDuration(Duration.ONE);
            }

            @Override
            protected void interpolate(double frac)
            {
                frameTick();
            }
        };

        AnimationTimer timer = new AnimationTimer()
        {

            @Override
            public void handle(long now)
            {
                frameTick();
            }
        };

        //Comment out either one
        trans.play();
        //timer.start();
    }
}

它主要计算动画计时器与过渡的帧速率。

当我使用javafx.animation.Transition 运行这个 FPS 计算器时,它会输出大约 600 ~ 100000 fps(大范围)。当我使用 AnimationTimer 对其进行测试时,它以 60fps 左右的速度很好地结束。

只是好奇,这两种方法之间的内部差异是什么导致结果如此贬低?

【问题讨论】:

    标签: java animation javafx


    【解决方案1】:

    通过过渡,您不是在测量实际的帧速率;您只是在测量调用interpolate 的频率。场景仍将仅以 Prism 渲染机制限制的速率渲染(默认为 60fps)。

    因此,如果您的 interpolate 方法实际上更改了场景图,则并非所有这些更改都会在场景中真正实现。

    相比之下,AnimationTimer 的 handle() 方法实际上是作为场景渲染的一部分调用的:因此它保证每帧只执行一次。

    【讨论】:

    • 谢谢。感谢您对interpolate 与AnimationTimer 的解释
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    • 2011-10-03
    • 2019-06-16
    • 2020-08-23
    • 2013-01-19
    • 1970-01-01
    相关资源
    最近更新 更多