【发布时间】:2015-03-02 21:05:52
【问题描述】:
我需要创建一个 100fps 的动画,显示来自每秒 100 帧的文件中的 3d 数据。但是 javaFx 中的 AnimationTimer 只允许我获得 60fps。如何克服它?
【问题讨论】:
标签: javafx-8
我需要创建一个 100fps 的动画,显示来自每秒 100 帧的文件中的 3d 数据。但是 javaFx 中的 AnimationTimer 只允许我获得 60fps。如何克服它?
【问题讨论】:
标签: javafx-8
移除 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 所述,适用于使用未记录功能的正常警告:
请注意,如果我们没有记录命令行开关,那么在后续版本中删除/修改它们是公平的游戏:-)
【讨论】:
-Djavafx.animation.fullspeed=true 有效。 -Djavafx.animation.framerate 无法单独使用或与 fullspeed 属性一起使用。
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();
【讨论】: