使用JavaFX调节每秒执行的次数
所以现在我正在用JavaFX实现康威的生活游戏。简而言之,在我的类扩展AnimationTimer中,在handle()方法中,它遍历2D数组中的每个单元格并更新每个位置,然后使用2D数组中的信息绘制到画布 这工作完全正常,但问题是它运行得太快了。你看不到画布上到底发生了什么。在窗口上,我有画布和几个按钮。我添加了一个Thread.sleep(1000)来尝试调整每秒的生成/帧,但这样做会导致窗口无法立即检测到按钮按下。当不告诉线程睡眠时,按下按钮是完全响应的 有人对如何解决这个问题有什么建议吗?你可以用哪个更适合这个问题。将循环计数设置为使用JavaFX调节每秒执行的次数,java,canvas,javafx,frame-rate,Java,Canvas,Javafx,Frame Rate,所以现在我正在用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()的参数
是以纳秒为单位的时间戳。因此,您可以跟踪上一次更新,并且仅当经过的时间超过某个阈值时才执行更新。这比计算帧(可能有不同的间隔)更准确。它本质上等同于时间线解决方案-选择只是风格问题。