2014-02-08 87 views
2

我在優化渲染大量自定義控件時遇到了一個大問題。我正在開發一個系統,該系統將用於每秒鐘或頻繁更新數千個自定義控件並更新這些控件的多個值。還將支持縮放和平移。但是我發現渲染(在畫布上)需要很長時間,縮放和平移是滯後的。 有沒有人有這種WPF應用程序的經驗?優化渲染數千個元素

+0

我發現用信息重載用戶是件壞事。你真的必須一次向他們展示成千上萬的東西嗎? –

+0

@Simon我的客戶有這些要求。在測試過程中,我發現幾乎不可能監控所有控件。在我的選擇中,最佳的控件數量約爲300-500。但渲染和縮放的問題仍然存在。 – user2250152

+0

您需要爲這些所有元素提供鍵盤和鼠標支持嗎?如果不是,您可以使用可視圖層並使用DrawingVisual類或其他較低級別的對象繪製「元素」。 – Jan

回答

0

根據我的經驗,這幾乎總是由於無意中禁用虛擬化和容器回收,通常是通過樣式/模板。我的第一步是在運行時檢查WPF Tree Visualizer,並確保只繪製實際可見的元素。

+0

只是他正在使用畫布而不是可以放置在項目控件中的任何類型的面板。 –

+0

對不起,我不明白你的意思是什麼意思。一個'ItemsControl'面板可以替換爲'Canvas'和[本文](http://blogs.msdn.com/b/kaelr/archive/2010/08/11/zoomableapplication2-a-million-items。 aspx)顯示它可以被虛擬化。 –

0

您可以使用BitmapCache禁用重新渲染尚未更改的控件。

以我的經驗,這大大提高了縮放和平移性能。

爲更復雜的控件啓用它。

實施例:

<Rectangle CacheMode="BitmapCache" /> 

<Rectangle> 
    <Rectangle.CacheMode> 
     <BitmapCache/> 
    </Rectangle.CacheMode> 
</Rectangle> 

詳細here

+0

我認爲你是對的。緩存可以是如何處理這個問題的最佳方式。特別是用@markE提到的想法。你認爲緩存包含控件的Canvas或者在控件的各個部分應用緩存會更好嗎? – user2250152

+0

我建議緩存個別複雜的控件,但這是我的經驗中的反覆試驗 – thumbmunkeys

0

使用2個畫布是相同尺寸,並在同一位置(頂部帆布覆蓋在底部帆布)。

底部畫布:顯示所有控件。這是一個靜態圖像(緩存),可能每隔30秒刷新一次。

頂部畫布:顯示在過去30秒內發生變化的每個控件。

2個畫布完全對齊,因此頂部畫布上每個最近更改的控件都會完全遮擋其底部畫布上的過時的雙胞胎。

這樣你只需要畫出幾個已經改變的控件而不是所有的控件。