2011-03-23 51 views
37

如果WPF應用程序的屏幕包含大量原始控件,則其渲染將變得緩慢。在這種情況下,除了增加更少的控件和使用更強大的視頻卡之外,還有哪些建議的方法可以提高WPF應用程序的響應速度?提高WPF UI渲染速度的方法

有沒有辦法以某種方式使用屏幕外緩衝或類似的東西?

+0

你可以給一些數字嗎?每個窗口的控件數量等。 – NVM 2011-03-23 17:32:28

+0

@NVM實際上,現在每個窗口大約有一千個自定義控件(自​​定義控件包含幾個邊框,文本塊並且具有幾十個依賴項屬性)。控件的數量可以增加。但已經這個數量需要一些不舒服的秒數來在初始渲染上可視化自己。另外,它放大時不提供很好的平滑滾動。 – rem 2011-03-23 17:53:54

+0

我發現很難在用戶面前同時顯示具有一千個文本框的UI。無論如何,取決於如何安排一切,您可以使用內置虛擬化面板之一或編寫自己的自定義窗口,只創建可見的控件。這應該會顯着加快事態發展。 – NVM 2011-03-23 20:37:34

回答

43

我們的團隊面臨着渲染性能。在我們的例子中,我們有大約400個運輸單元,我們應該爲每個單元提供很多細節(文本標籤,特殊標記,不同幾何形狀等)的圖表。

在我們的實現中,我們首先將每個圖表分成基元,並通過綁定組合整個單元的圖表。這是非常難過的經歷。 UI反應非常緩慢。

因此,我們決定創建一個每個單元的UI元素,並使用DrawingContext呈現圖表。雖然這在性能方面要好得多,但我們花了大約一個月時間來改善渲染。

一些建議:

  1. 緩存一切。畫筆,顏色,幾何,格式化文本,字形。 (例如,我們有兩個類:RenderToolsTextCache。將每個單元的渲染過程地址分配給兩個類的共享實例,因此如果兩個圖表具有相同的文本,則只准備執行一次)
  2. 凍結Freezable,如果您打算長期使用它。尤其是幾何形狀。複雜的解凍幾何執行HitTest非常緩慢。
  3. 選擇每種圖元渲染的最快方式。例如,大約有6種文本渲染方式,但最快的是DrawingContext.DrawGlyphs
  4. 使用分析器發現熱點。例如,在我們的項目中,我們有幾何緩存並根據需要呈現適當的緩存。它似乎是,沒有任何改進是可能的。但有一天,我們想如果我們一次渲染幾何圖形並緩存準備好的圖像?在我們這種情況下,這種做法是可以接受我們單位的圖表只有幾個州。當圖表數據發生變化時,我們爲每個狀態重建DrawingVisual並將它們放入緩存中。

當然,這種方式需要一些投資,這是枯燥乏味的工作,但結果是真棒。順便說一下:當我們打開WPF緩存選項(你可以在答案中找到鏈接),我們的應用程序掛起。

+0

我意識到這篇文章有點舊,但我想知道你用什麼方法來緩存刷子,顏色和什麼。如果我知道如何做到這一點,我覺得我可以避免一些滯後。 – 2012-06-18 17:17:33

+4

[Here](http://pastebin.com/v83XZLTc)我上傳了RenderTools對象的簡化版本。 [這裏](http://pastebin.com/e8VhuHez)就是使用示例。 如果你仍然有問題,隨時問。 – 2012-06-21 14:33:20

+0

非常感謝。我會看看他們。 – 2012-06-21 17:47:44

3

看看新的(.NET 4.0)緩存選項。 (見here。)

+0

是不是隻適用於Silverlight? – 2016-11-16 23:28:09

+0

@ mark:不,它不是。我在WPF項目中使用過它。您可以單擊鏈接頁面中的「其他版本」鏈接查看其他支持的框架。 – Jens 2016-11-17 09:27:20

5

,因爲有一年我已經受夠了一個高度定製的DataGrid相同的PERF的問題,我的結論是:

也基本上沒有什麼,你可以在你的身邊做 (不影響你 應用,即:具有較少的控制或 只使用默認樣式)

由延提到的鏈接是偉大的,但你的情況也沒用。

NVM提供的「優化WPF應用程序性能」鏈接在我的經驗中幾乎同樣沒用:它只是吸引常識,我相信你不會學到任何非凡的閱讀。 除了一件事情可能:我必須說這個鏈接教會我儘可能多地放入我的應用資源。因爲WPF不會重新資助你放入資源的任何東西,它只是反覆使用同一資源。因此,儘可能多的,你可以在那裏(樣式,畫筆,模板,字體...)

總而言之,根本沒有辦法讓WPF中的事情變得更快,只需通過檢查選項或關閉其他。你可以在不久的將來祈求MS重做他們的渲染層來優化它,同時,儘量減少你對效果和定製控制的需求......