2012-03-16 6 views
3

私はシリアル経由でハードウェアデバイスと通信しているアプリケーションを持っています。このデバイスは、30msごとにjsonオブジェクトを送信しています。このjsonオブジェクトは、モーションコントローラの「状態」を表すデバイスです。高速動作のためにJavaFX2 guiを更新する最良の方法は何ですか?

基本的にメッセージは次のようになります。

{"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}} 

私はすべての30msのこれらの1xを取得します。私はそれらを解析する必要があります。次にそれらをJavaFX GUIに「描画」します。

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); 

} 

だから、基本的に、私は実行可能なすべての30msのは、その後の解析対象と図面を作成しています。ここ

は、私が解析しています方法です。これを行うにはこれが最善の方法ですか?

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

しかし、それはその「ぎくしゃく」と、かなりのリソース空腹のように思える:あなたはアクションで、それの映像を見ることができます。誰かがこのコードを最適化する方法を提案してくれることを願っています。おそらく私が紛失しているものを指摘していますか?

私たちが作っているモーションコントローラボードは、TinyGと呼ばれています。オープンソースのハードウェア
詳細情報はこちら:ここ http://www.synthetos.com/wiki/index.php?title=Projects:TinyG

ファームウェア: https://github.com/synthetos/TinyG

ありがとう!

+0

たぶん、あなたは、NetBeansプロファイラまたはEclipseの[TPTPプラグイン](http://www.eclipse.orgであなたのアプリケーションをプロファイリングすることができます/ tptp /)、誰が資源を掘り出しているかを調べる。 –

答えて

3

データが解析されている間にグラフィックレンダリングをブロックするイベントキューで計算が多すぎるようです。あなたは別のスレッドで計算を行うだけで、関連するUIコードのため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. 
    } 
+0

'xAxisVal.getText()'と 'yAxisVal.getText()'の呼び出しをJavaFXアプリケーションスレッドから外す必要はないと思います。 – jewelsea

+0

そうですが、ほとんどの場合に機能します。とにかく、彼らはコメントに記載されているように全く呼び出されるべきではありません。 –

関連する問題