2017-04-20 97 views
0

我正在使用JavaFX Canvas隨着時間的推移動畫Shape和Polyline對象的運動。 當前,每個幀,列表中每個Shape或Polyline的X和Y的位置都會根據需要進行編輯,並移動該對象。 這導致大約20-30fpsJavaFX Canvas高效動畫

我嘗試過的一種較早的方法只是每隔一幀清除畫布並重新繪製每個對象。沒有存儲對象列表。 這個結果是60fps

這第二種方法似乎是一種更爲複雜的方法,但卻導致了更好的幀率。

是否有任何最佳實踐或建議的方法在JavaFX畫布上進行動畫製作?任何干淨和推薦的結果都會導致良好的幀率?

非常感謝

+0

你可以發佈代碼嗎? – Oswald

+1

我懷疑你在第一個例子中使用畫布。只需更改某些形狀的x/y位置,就無法在JavaFX Canvas上移動任何內容。我猜你在這裏正在談論場景圖。你能否澄清這一點? – mipa

回答

2

我只是給了一個談論這些問題在JavaLand會議。對於使用Canvas的基於路徑的形狀(如折線和多邊形)的一般動畫來說,目前確實是最快的標準選項。這是由於JavaFX中的一個錯誤,它可以通過場景圖緩慢地實現動畫效果。我已經報告過這個問題,並且正在修復一個錯誤。

https://bugs.openjdk.java.net/browse/JDK-8178521

在這個JIRA問題我指的是硬件與軟件渲染,但它也影響了場景圖與渲染畫布由於畫布似乎並沒有受到此問題的影響。

+0

請注意,錯誤報告下面的註釋提示可能的解決方法:將系統屬性'prism.cacheshapes'設置爲'false'。您可以在命令行中使用VM參數「-Dprism.cacheshapes = false」來執行此操作。如果你想以編程的方式來做到這一點,你顯然必須在* Application類加載之前這樣做(我不知道爲什麼),這意味着你需要一個單獨的主類與System.setProperty(「prism.cacheshapes 「,」false「);'然後'Application.launch(MyApplicationSubclass.class);'。 –

+1

我懷疑這是一個好主意,除非你不做別的動畫形狀。通常緩存形狀是有意義的。 – mipa