使用JavaFX

时间:2016-02-08 22:35:18

标签: java canvas javafx frame-rate

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

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

有没有人对如何解决这个问题有任何建议?

1 个答案:

答案 0 :(得分:2)

您可以使用Timeline,这可能更适合此。将周期数设置为Animation.INDEFINITE,并在更新之间添加KeyFrame,并将当前handle实施添加为框架的onFinished

final Timeline timeline = new Timeline();
timeline.setCycleCount(Timeline.INDEFINITE);
timeline.getKeyFrames().add(
        new KeyFrame(
                Duration.seconds(1), 
                event -> handle()
        )
);
timeline.play();

或者,您可以尝试将KeyFrame的延迟设为零,并使用时间轴的targetFrameRate,但我个人从未尝试过。

修改:另一个选项是在frameSkip中保留AnimationTimer变量:

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...
}