获取JavaFX应用程序帧速率的首选方法是什么?

前端之家收集整理的这篇文章主要介绍了获取JavaFX应用程序帧速率的首选方法是什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这是一个非常简单的问题:

获取JavaFX应用程序帧速率的首选方法是什么?

谷歌出现了2009年的结果,但这个例子与JavaFX 1.x有关,并且以一种奇怪的方式(某种外部仪表)开始运行.我无法找到更好的例子,我在这里发帖.

我希望能够查询我的JavaFX应用程序(或者如果需要,查询当前场景)并获得当前的FPS.

更新:2015年2月8日

该问题的各种解决方案在下面作为答案发布.我还发现这个问题被以下博客文章引用:http://tomasmikula.github.io/blog/2015/02/08/measuring-fps-with-reactfx.html

其中说(由于下面的解决方案的详细程度)测量FPS被添加到ReactFX 2.0里程碑2.冷却事物的传播方式.

解决方法

你可以使用 AnimationTimer.

每个帧都调用一次AnimationTimer的handle方法,传入的值是以纳秒为单位的当前时间(最佳近似值).因此,您可以跟踪自上一帧以来的时间.

这是一个实现,它跟踪最后100帧的时间并使用它们计算帧速率:

import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class SimpleFrameRateMeter extends Application {

    private final long[] frameTimes = new long[100];
    private int frameTimeIndex = 0 ;
    private boolean arrayFilled = false ;

    @Override
    public void start(Stage primaryStage) {

        Label label = new Label();
        AnimationTimer frameRateMeter = new AnimationTimer() {

            @Override
            public void handle(long now) {
                long oldFrameTime = frameTimes[frameTimeIndex] ;
                frameTimes[frameTimeIndex] = now ;
                frameTimeIndex = (frameTimeIndex + 1) % frameTimes.length ;
                if (frameTimeIndex == 0) {
                    arrayFilled = true ;
                }
                if (arrayFilled) {
                    long elapsedNanos = now - oldFrameTime ;
                    long elapsedNanosPerFrame = elapsedNanos / frameTimes.length ;
                    double frameRate = 1_000_000_000.0 / elapsedNanosPerFrame ;
                    label.setText(String.format("Current frame rate: %.3f",frameRate));
                }
            }
        };

        frameRateMeter.start();

        primaryStage.setScene(new Scene(new StackPane(label),250,150));
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
原文链接:https://www.f2er.com/java/125174.html

猜你在找的Java相关文章