使用JavaFX调整每秒执行次数

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

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

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

您可以使用可能更适合此的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 ,但我个人从未尝试过。

编辑:另一个选项是在您的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... }