2014-04-15 46 views
0

即時通訊試圖建立大學項目交通模擬。 已經實施交通燈邏輯,動態控制所有的交通信號燈等... Im堅持添加車輛作爲路徑轉換節點。 如果我加入了很多他們與監聽每一個有它自己的boundsInParentProperty變化監聽:JavaFX流量模擬轉換

-collision與其他車輛讓他們在紅綠燈面前除了

- 面積要能夠停止時紅色是在

然後即時結束了很多的計算,這將使動畫不ui油炸,應用程序變得沒有反應。

我猜測轉換需要成爲主要javafx UI線程的一部分,聽衆呢? 上選擇正確的做法任何幫助表示讚賞

+0

不檢查碰撞時的性能如何? – CodeCamper

+0

它運行平穩,超過150輛車(現在用簡單的矩形表示) – Nikola

回答

2

穿線的規則是:

  1. 是場景圖必須由FX應用程序線程可以訪問 的一部分的任何節點的性能。
  2. 避免在FX應用程序線程上做任何不必要的計算。

很明顯,你遇到這種情況很難管理,因爲冗長的計算涉及必須在FX應用程序線程上訪問的屬性。

javafx.concurrent包和javafx.animation包有許多便利線程管理的工具。具體來說,有多個回調定義了在FX應用程序線程上執行的區域。

節點修改它們的屬性,並因此在FX應用程序線程上執行任何更改偵聽器的方法。轉場更新他們在FX應用程序線程上操作的屬性的狀態,並使用回調函數(如setOnFinished(...))執行相同的操作。在javafx.concurrent API中,Task類有一個call(...)方法,該方法打算在後臺線程上執行,並且存在各種回調方法(updateMessage(...),updateProgress(...)),以及一些處理程序:setOnSucceeded(...)等,這些處理程序都被執行在FX應用程序線程上。

對於這樣的模擬,我建議看看AnimationTimer。這有一個handle()方法供您執行,每調用一次渲染幀就會調用一次。它收到一個long參數,它是一個以納秒爲單位的時間戳。 JavaFX的目標幀速率(當前)爲60fps,因此您應該瞄準在此處執行相當快的代碼,否則您會減慢幀速率,但實際上可以在16ms內完成很多操作。

Here是一個使用這種技術的例子。這只是模擬很多球在一個盒子裏彈跳,但它會給你一個想法。我還有一個版本在某個地方踢球,每個球執行它自己的AnimationTimer檢查牆碰撞,然後有另一個AnimationTimer檢查球與球的碰撞;表現非常相似(這並不令人意外)。我在未完成的太空侵略者模擬中使用了「每個對象的AnimationFrame」方法,並且它工作得非常好。

+0

這是迄今爲止的結果。 https://www.youtube.com/watch?v=ccEN7PK2-F8實時運行流暢。使用動畫計時器作爲建議的循環。如果你能找到每個球有自己的動畫計時器的例子,請欣賞。謝謝 – Nikola

+0

更新:) http://youtu.be/retrZPfp3UI – Nikola