2016-02-08 3 views
0

Итак, я сейчас использую Game of Life от Conway с использованием JavaFX. В двух словах, в моем классе, расширяющем AnimationTimer, в методе handle() он проходит через каждую ячейку в 2D-массиве и обновляет каждую позицию, а затем рисует на холст, используя информацию в 2D-массиве.Регулирование количества исполнений в секунду с использованием JavaFX

Это работает отлично, но проблема в том, что он слишком быстро работает. Вы не можете увидеть, что происходит на холсте. В окне у меня есть холст, а также несколько кнопок. Я добавил Thread.sleep (1000), чтобы попытаться отрегулировать поколение/кадр в секунду, но при этом окно не обнаруживает нажатия кнопки немедленно. Нажатие кнопки полностью реагирует, когда вы не говорите нить спать.

У кого-нибудь есть предложения по тому, как это решить?

ответ

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, но лично я никогда не пробовал.

Edit: Еще один вариант, чтобы сохранить 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... 
} 
+3

В качестве небольшого изменения второго варианта, обратите внимание, что параметр 'AnimationTimer.handle()' отметка времени в наносекунд , Таким образом, вы можете отслеживать последнее обновление и выполнять только обновление, если количество пройденного времени больше определенного порогового значения. Это более точно, чем подсчет кадров, которые могут иметь разные интервалы. Это по сути эквивалентно решению Timeline - выбор - это только вопрос стиля. –

 Смежные вопросы

  • Нет связанных вопросов^_^