Каков наилучший способ обновления графического интерфейса JavaFX2 для высокоскоростных операций? - PullRequest
3 голосов
/ 16 марта 2012

У меня есть приложение, которое разговаривает с аппаратным устройством через последовательный порт. Это устройство отправляет объект json каждые 30 мс. Этот объект json является устройством, "заявляющим" свой контроллер движения.

В основном сообщения выглядят так:

{"sr":{"line":2524,"posx":1.000,"posy":21.000,"posz":20.000,"posa":11.459,"feed":0.000,"vel":0.000,"unit":1,"coor":1,"dist":0,"frmo":0,"momo":0,"stat":2}}

Я получаю эти 1x каждые 30 мс. Я должен разобрать их. Затем «нарисуйте» их на графический интерфейс JavaFX.

Вот как я разбираю:

Platform.runLater(new Runnable() {

            public void run() {
                //We are now back in the EventThread and can update the GUI
                try {
                    JsonRootNode json = JDOM.parse(l);

                    xAxisVal.setText(json.getNode("sr").getNode("posx").getText());
                    yAxisVal.setText(json.getNode("sr").getNode("posy").getText());
                    zAxisVal.setText(json.getNode("sr").getNode("posz").getText());
                    aAxisVal.setText(json.getNode("sr").getNode("posa").getText());
                    drawLine();

                } catch (argo.saj.InvalidSyntaxException ex) {
                    //Json line invalid.
                }
            }
        });

А вот код розыгрыша, который я использую:

public void drawLine() {
    xl.setX(Float.parseFloat(xAxisVal.getText()) + 400);
    y1.setY(Float.parseFloat(yAxisVal.getText()) + 400);
    LineTo tmpL = new LineTo((Float.parseFloat(xAxisVal.getText()) * 2) + 400, (Float.parseFloat(yAxisVal.getText()) * 2) + 400);
    path.getElements().add(tmpL);

}

Так что в основном я создаю работающий объект каждые 30 мс, затем анализирую и рисую. Это лучший способ сделать это? Вы можете посмотреть видео в действии:

http://www.youtube.com/watch?v=dhBB3QcmHOg&feature=youtu.be

Но, похоже, это "отрывистый" и довольно жадный ресурс. Я надеюсь, что кто-нибудь даст мне предложения о том, как оптимизировать этот код? Возможно, укажите на то, чего мне не хватает?

Как FYI, плата контроллера движения, которую мы создаем, называется TinyG. Аппаратное обеспечение с открытым исходным кодом.
Больше информации здесь: http://www.synthetos.com/wiki/index.php?title=Projects:TinyG

Прошивка здесь: https://github.com/synthetos/TinyG

Спасибо!

Ответы [ 2 ]

3 голосов
/ 18 марта 2012

Похоже, вы выполняете слишком много вычислений в очереди событий, что блокирует визуализацию графики во время анализа ваших данных. Вы должны производить вычисления в отдельном потоке и вызывать Platform.runLater() только для соответствующего кода пользовательского интерфейса:

    try {

        JsonRootNode json = JDOM.parse(l);
        final String xVal = json.getNode("sr").getNode("posx").getText();
        final String yVal = json.getNode("sr").getNode("posy").getText();
        final String zVal = json.getNode("sr").getNode("posz").getText();
        final String aVal = json.getNode("sr").getNode("posa").getText();

        // here you are calling UI getter, and parse it each time
        // it would be more optimal to store `x` value in separate variable
        // between updates
        final float x = Float.parseFloat(xAxisVal.getText());
        final float y = Float.parseFloat(yAxisVal.getText());

        Platform.runLater(new Runnable() {

            public void run() {
                //We are now back in the EventThread and can update the GUI
                try {

                    xAxisVal.setText(xVal);
                    yAxisVal.setText(yVal);
                    zAxisVal.setText(zVal);
                    aAxisVal.setText(aVal);
                    xl.setX(x + 400);
                    y1.setY(y + 400);
                    LineTo tmpL = new LineTo(x * 2 + 400, y * 2 + 400);
                    path.getElements().add(tmpL);

                }
            }
        }

    } catch (argo.saj.InvalidSyntaxException ex) {
        //Json line invalid.
    }
1 голос
/ 16 марта 2012

Если вы еще этого не сделали, попробуйте предварительный выпуск для разработчиков . В ветку предварительного просмотра JavaFX 2.1 были внесены некоторые изменения: плавная анимация и производительность рендеринга и оптимизация логики пути .

Альтернативными подходами может быть запись на холст HTML5 в WebView или использование узла холста JavaFX , как только он будет доступен в JavaFX 2.2.

...