Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JavaFX调节每秒执行的次数_Java_Canvas_Javafx_Frame Rate - Fatal编程技术网

使用JavaFX调节每秒执行的次数

使用JavaFX调节每秒执行的次数,java,canvas,javafx,frame-rate,Java,Canvas,Javafx,Frame Rate,所以现在我正在用JavaFX实现康威的生活游戏。简而言之,在我的类扩展AnimationTimer中,在handle()方法中,它遍历2D数组中的每个单元格并更新每个位置,然后使用2D数组中的信息绘制到画布 这工作完全正常,但问题是它运行得太快了。你看不到画布上到底发生了什么。在窗口上,我有画布和几个按钮。我添加了一个Thread.sleep(1000)来尝试调整每秒的生成/帧,但这样做会导致窗口无法立即检测到按钮按下。当不告诉线程睡眠时,按下按钮是完全响应的 有人对如何解决这个问题有什么建议吗

所以现在我正在用JavaFX实现康威的生活游戏。简而言之,在我的类扩展AnimationTimer中,在handle()方法中,它遍历2D数组中的每个单元格并更新每个位置,然后使用2D数组中的信息绘制到画布

这工作完全正常,但问题是它运行得太快了。你看不到画布上到底发生了什么。在窗口上,我有画布和几个按钮。我添加了一个Thread.sleep(1000)来尝试调整每秒的生成/帧,但这样做会导致窗口无法立即检测到按钮按下。当不告诉线程睡眠时,按下按钮是完全响应的

有人对如何解决这个问题有什么建议吗?

你可以用哪个更适合这个问题。将循环计数设置为
Animation.unfinite
,并添加一个
关键帧
,在更新之间添加所需的延迟,并将当前的
执行处理为帧的
未完成

final Timeline timeline = new Timeline();
timeline.setCycleCount(Timeline.INDEFINITE);
timeline.getKeyFrames().add(
        new KeyFrame(
                Duration.seconds(1), 
                event -> handle()
        )
);
timeline.play();
或者,您可以尝试将
关键帧的延迟设置为零,并使用时间轴的
targetFrameRate
,但我个人从未尝试过

编辑:另一个选项是在
AnimationTimer
中保留
frameSkip
变量:

private int frameSkip = 0;
private final int SKIP = 10;

@Override
public void handle(long now) {
    frameSkip++;
    if (frameSkip <= SKIP) {
        // Do nothing, wait for next frame;
        return;
    }
    // Every SKIP frames, reset frameSkip and do animation
    frameSkip = 0;

    // Do animation...
}
private int frameSkip=0;
私人最终整数跳过=10;
@凌驾
公共无效句柄(长){
frameSkip++;
如果(frameSkip,您可以使用可能更适合此操作的方法。将循环计数设置为
动画。不确定
,并添加一个
关键帧
,在更新和当前
句柄
实现之间具有所需的延迟,作为帧的
完成

final Timeline timeline = new Timeline();
timeline.setCycleCount(Timeline.INDEFINITE);
timeline.getKeyFrames().add(
        new KeyFrame(
                Duration.seconds(1), 
                event -> handle()
        )
);
timeline.play();
或者,您可以尝试将
关键帧的延迟设置为零,并使用时间轴的
targetFrameRate
,但我个人从未尝试过

编辑:另一个选项是在
AnimationTimer
中保留
frameSkip
变量:

private int frameSkip = 0;
private final int SKIP = 10;

@Override
public void handle(long now) {
    frameSkip++;
    if (frameSkip <= SKIP) {
        // Do nothing, wait for next frame;
        return;
    }
    // Every SKIP frames, reset frameSkip and do animation
    frameSkip = 0;

    // Do animation...
}
private int frameSkip=0;
私人最终整数跳过=10;
@凌驾
公共无效句柄(长){
frameSkip++;

如果(frameSkip)是第二个选项的一个细微变化,请注意
AnimationTimer.handle()的参数
是以纳秒为单位的时间戳。因此,您可以跟踪上一次更新,并且仅当经过的时间大于某个阈值时才执行更新。这比计算帧(可能有不同的间隔)更准确。它本质上等同于时间线解决方案-选择只是样式问题。作为sli对于第二个选项的变体,请注意
AnimationTimer.handle()的参数
是以纳秒为单位的时间戳。因此,您可以跟踪上一次更新,并且仅当经过的时间超过某个阈值时才执行更新。这比计算帧(可能有不同的间隔)更准确。它本质上等同于时间线解决方案-选择只是风格问题。