【问题标题】:How to ignore the 60fps limit in javafx?如何忽略 javafx 中的 60fps 限制?
【发布时间】:2015-03-02 21:05:52
【问题描述】:

我需要创建一个 100fps 的动画,显示来自每秒 100 帧的文件中的 3d 数据。但是 javaFx 中的 AnimationTimer 只允许我获得 60fps。如何克服它?

【问题讨论】:

    标签: javafx-8


    【解决方案1】:

    移除 JavaFX 帧速率上限

    您可以通过设置系统属性来移除 60fps JavaFX 帧速率上限,例如,

    java -Djavafx.animation.fullspeed=true MyApp
    

    这是一个undocumented and unsupported setting

    移除 JavaFX 帧速率上限可能会使您的应用程序在资源使用方面的效率大大降低(例如,没有帧速率上限的 JavaFX 应用程序将比具有帧速率上限的应用程序消耗更多的 CPU)。

    配置 JavaFX 帧速率上限

    此外,您可以尝试另一个未记录的系统属性:

    javafx.animation.framerate
    

    我没试过。

    调试 JavaFX 帧(脉冲)

    您可以启用 other settings like -Djavafx.pulseLogger=true 来帮助您调试 JavaFX 架构并验证您的应用程序实际上是否以您期望的帧速率运行。

    JavaFX 8 有一个脉冲记录器(-Djavafx.pulseLogger=true 系统属性),可以“打印出很多关于 JavaFX 引擎执行的废话”(以一种好的方式)。每个脉冲都有很多提供的信息,包括脉冲数(自动递增整数)、脉冲持续时间和自上次脉冲以来的时间。该信息还包括线程详细信息和事件详细信息。这些数据使开发人员可以查看大部分时间花费的时间。

    警告

    Richard Bair from the JavaFX team 所述,适用于使用未记录功能的正常警告:

    请注意,如果我们没有记录命令行开关,那么在后续版本中删除/修改它们是公平的游戏:-)

    【讨论】:

    • 我可以确认 java -Djavafx.animation.fullspeed=true MyApp 在添加为 VM arg 时可以完美运行。
    • 在 Windows 7 64 位上使用 Oracle 1.8.121 64 位测试,-Djavafx.animation.fullspeed=true 有效。 -Djavafx.animation.framerate 无法单独使用或与 fullspeed 属性一起使用。
    【解决方案2】:

    Fullspeed=true 会在不受控制的情况下为您提供高帧率(从而降低应用程序的性能,因为它呈现过多),帧率确实不起作用。 使用:

    -Djavafx.animation.pulse=value
    

    您可以使用以下代码检查您的帧率。我通过将脉冲速率设置为 2、60 和 120(我有一个 240Hz 显示器)来检查它是否真的有效,你会发现随机数变化的速度有所不同。

     private final long[] frameTimes = new long[100];
        private int frameTimeIndex = 0 ;
        private boolean arrayFilled = false ;
        Label label = new Label();
            root.getChildren().add(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" +", Random number:" + Math.random(), frameRate));
                    }
                }
            };
    
            frameRateMeter.start();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-16
      • 1970-01-01
      • 2020-07-25
      • 2017-03-11
      • 1970-01-01
      • 2018-12-08
      • 2014-11-20
      • 2023-03-20
      相关资源
      最近更新 更多