Я разрабатываю программу, которая сможет рисовать звуковую форму с использованием потоковых данных амплитуды с микрофона или линейного входа. Я подумал, что для этого нужно будет нарисовать каждую точку из данных выборки со скоростью, равной частоте выборки, и сделать шаг 1 в направлении x с каждой нарисованной точкой. Поэтому мне нужно обновлять поток приложения JavaFx примерно 44100 раз в секунду, чтобы нарисовать каждую точку. Прежде чем начать, я хотел проверить свою идею, просто нарисовав прямую линию и обновляя каждую точку каждые полсекунды. Я использую класс Timeline, чтобы сделать это. Мой код выглядит так:
public class JavaFxPractice extends Application {
private int xValue = 50;
@Override
public void start(Stage primaryStage) {
Pane pane = new Pane();
EventHandler<ActionEvent> eventHandler = e -> {
xValue++;
Line point = new Line(xValue,50,xValue,50);
pane.getChildren().add(point);
};
Timeline animation = new Timeline(new KeyFrame(Duration.millis((500)), eventHandler));
animation.setCycleCount(500);
animation.play();
Scene scene = new Scene(pane, 600, 500);
primaryStage.setTitle("Streaming Test");
primaryStage.setScene(scene);
primaryStage.show();
}
}
Однако каждый раз, когда я делаю это, моя программа перестает отвечать на запросы, и мне приходится принудительно закрывать ее. Я заметил, что если я делаю то же самое, но вместо этого заставляю текст мигать и выключаться, это прекрасно работает. Есть ли причина, по которой линии не могут быть нарисованы с использованием класса Timeline? Не слишком ли сильно загружен поток? Если так, то каким образом я могу решить мою идею? Я просто хочу иметь возможность рисовать осциллограммы в режиме реального времени, обновляя их со скоростью 44 100 раз в секунду.