2014-10-17 102 views
0

有什麼解決方法,如何繪製到JavaFX中的圖像類似於Canvas?不像像素,但像GraphicsContext2D提供的高級繪圖功能。我正在嘗試創建多層次的Canvas,並且爲每個新層使用另一個Canvas組件看起來似乎是一種矯枉過正。或者這是正確且唯一的優先方法?JavaFX繪製到圖像

回答

0

使用多個canvas實例(每個圖層一個),是推薦的創建多層畫布的方法(使用immediate draw API)。這種生成分層帆布系統的方法已在Oracle JavaFX tutorials: Working with Canvas: Creating a Simple Layer System中進行了記錄和演示。

您的其他選項,可能是沒有用的帆布可言,而是使用JavaFX scene graphretained draw API),將場景圖節點Panes(每層一個窗格)的內部分層,並把所有的層在StackPane裏面的窗格。您可以隨時通過調用StackPane上的節點snapshot API將生成的StackPane轉換爲圖像。

Isn't Canvas是否還保留了API?由於所有的操作都只是放在GrowableDataBuffer上並在事件上呈現?

是的,調用畫布API立即繪製是一個誤稱。它的確如你所說的那樣工作。儘管如此,我認爲從概念上將API視爲即時繪圖是非常有用的,因爲這對於使用API​​的開發人員來說顯得很相似,它更多地是使用保留的數據結構來協助初始渲染的實現細節。

就我所瞭解的實現設計而言,當您將繪圖命令發佈到畫布時,通常會將這些命令放置在緩衝區中,並在畫布的第一個渲染pulse發生時將緩衝區刷新爲圖像紋理。所以這些命令只會保留在內部實現中,直到第一次呈現事件。如果您在後續脈衝上進一步發出畫布繪製命令,那麼這些附加命令將被緩衝,然後在下一個脈衝的渲染階段刷新。

例如,如果您在單個脈衝中爲畫布發出1百萬個繪圖命令,則會看到暫停,因爲這些命令會被緩衝並呈現,但您不會看到屏幕逐漸更新一百萬次,只是一個更新。如果您以10個100萬條命令的脈衝發出1000萬個繪圖命令,則會看到屏幕更新10次。您必須向畫布發出大量繪圖命令才能看到此類行爲。

如果您在做detailed performance analysis of a JavaFX application,理解實現以正確理解性能結果非常重要,否則它不是您需要擔心的事情。我認爲這個實現細節不太可能對你的項目有嚴重的性能影響。

+0

Isn't Canvas是否還保留了API?由於所有的操作都只是放在GrowableDataBuffer上並在事件上呈現? – 2014-10-18 23:43:21