穿線的規則是:
- 是場景圖必須由FX應用程序線程可以訪問 的一部分的任何節點的性能。
- 避免在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」方法,並且它工作得非常好。
不檢查碰撞時的性能如何? – CodeCamper
它運行平穩,超過150輛車(現在用簡單的矩形表示) – Nikola