2011-05-17 117 views
3

我被賦予改善使用SWT的GC繪製圖表的股市圖表軟件的性能的任務。圖表繪圖需要改進,因爲圖表有時每秒重繪多次,並且消耗大量處理器時間。如何提高SWT繪圖性能?

Google搜索一下後,我發現一個blog entry,暗示直接修改ImageData對象,而不是使用GC的方法,從而獲得巨大的性能提升。

使用這種技術繪製水平和垂直直線和正方形形狀是一件容易的事情,但是當涉及繪製圓形和其他不規則形狀時,沒有簡單的方法。

有沒有人知道是否有一個庫在ImageData對象上繪製形狀,就像GC的方法在Image對象上做的那樣?

此外,有沒有人知道另一種方法來提高SWT性能?

在此先感謝。

+0

http://pub.cosylab.com/CSS/DOC-SWT_Vs._Swing_Performance_Comparison.pdf我遇到了另一個問題,可能會有一些幫助。 – dfb 2011-05-17 15:46:49

回答

4

我不會改進繪圖例程的性能,而是專注於繪圖邏輯。也許你可以重新繪製舊圖表和新圖表之間的區別?這當然很大程度上取決於圖表的外觀和數據。

儘量減少繪圖操作。不要試圖讓他們更快。

+1

示例:將背景(比例,標籤,網格)渲染爲圖像並使用它來設置渲染區域。然後在上面繪製圖表本身。 – 2011-05-17 15:53:13

2

這似乎是一個很大的步驟(而且),但改善SWT繪圖性能的最佳方法是切換到OpenGL呈現。我並不意味着你應該畫出你的整個UI,而是圖表的一部分。

有很多方法可以做到這一點。我的選擇是使用JOGL library。網絡上也有一些例子,展示瞭如何與SWT集成,如this one

這種方法的缺點是你必須學習和使用一個新的API,它與從java中知道的非常不同。

另一方面,隨着場景變得越來越複雜,將渲染外化到GPU的好處越來越大。我已經經歷了2倍到10倍的FPS收益。

另一件好事就是你不必深入研究OpenGL,像jMonkeyEngine這樣的大型圖書館,隱藏了大部分的底層複雜性。

5

衡量您的解決方案的性能。大部分時間花在哪裏?猜測是不夠的。在90%的案例中,你的猜測是錯誤的。如果你不知道,你不能解決問題。

SWT本身並不慢。實際上,SWT只是各個OS系統調用繪製的非常薄的一層。

SWT的問題之一是它是同步的。爲了確保線程問題不會造成問題,有一個全局鎖。所以如果你一次渲染多個線程,這可能是一個問題。

或者你可能沒有正確地緩存資源,如顏色和字體。這些創建起來很昂貴。你創建了多少個GC?你是否保留一個,或者你是否每幀創建一個新的?

但我只是在這裏猜測。除非您可以使用性能監視器來證明「大部分時間都花在......」,否則無法爲您提供幫助。