我在優化渲染大量自定義控件時遇到了一個大問題。我正在開發一個系統,該系統將用於每秒鐘或頻繁更新數千個自定義控件並更新這些控件的多個值。還將支持縮放和平移。但是我發現渲染(在畫布上)需要很長時間,縮放和平移是滯後的。 有沒有人有這種WPF應用程序的經驗?優化渲染數千個元素
回答
根據我的經驗,這幾乎總是由於無意中禁用虛擬化和容器回收,通常是通過樣式/模板。我的第一步是在運行時檢查WPF Tree Visualizer,並確保只繪製實際可見的元素。
只是他正在使用畫布而不是可以放置在項目控件中的任何類型的面板。 –
對不起,我不明白你的意思是什麼意思。一個'ItemsControl'面板可以替換爲'Canvas'和[本文](http://blogs.msdn.com/b/kaelr/archive/2010/08/11/zoomableapplication2-a-million-items。 aspx)顯示它可以被虛擬化。 –
您可以使用BitmapCache
禁用重新渲染尚未更改的控件。
以我的經驗,這大大提高了縮放和平移性能。
爲更復雜的控件啓用它。
實施例:
<Rectangle CacheMode="BitmapCache" />
<Rectangle>
<Rectangle.CacheMode>
<BitmapCache/>
</Rectangle.CacheMode>
</Rectangle>
詳細here
我認爲你是對的。緩存可以是如何處理這個問題的最佳方式。特別是用@markE提到的想法。你認爲緩存包含控件的Canvas或者在控件的各個部分應用緩存會更好嗎? – user2250152
我建議緩存個別複雜的控件,但這是我的經驗中的反覆試驗 – thumbmunkeys
使用2個畫布是相同尺寸,並在同一位置(頂部帆布覆蓋在底部帆布)。
底部畫布:顯示所有控件。這是一個靜態圖像(緩存),可能每隔30秒刷新一次。
頂部畫布:顯示在過去30秒內發生變化的每個控件。
2個畫布完全對齊,因此頂部畫布上每個最近更改的控件都會完全遮擋其底部畫布上的過時的雙胞胎。
這樣你只需要畫出幾個已經改變的控件而不是所有的控件。
- 1. 渲染優化
- 2. 優化陰影渲染
- 3. 渲染/排序優化
- 4. OpenGL四次渲染優化
- 5. Java swing渲染優化
- 6. jsTree - 渲染優化|很長的渲染與2000個節點
- 7. 渲染GXT元素
- 8. 渲染RadioGroup元素
- 9. 我可以使用JavaScript jQuery改進數千個元素的渲染嗎?
- 10. XML序列化 - 渲染空元素
- 11. 優化這個OpenGL渲染算法
- 12. WinRT UI元素渲染
- 13. WinRT元素渲染錯誤
- 14. FBML元素渲染延遲
- 15. 渲染部分UI元素
- 16. Yii - 元素渲染+錯誤
- 17. SVG渲染成HTML元素
- 18. 渲染聚合物元素
- 19. ReactDOM不渲染元素
- 20. ReactDOM渲染元素列表
- 21. 點擊一個不斷渲染元素
- 22. cakephp使用數據渲染元素
- 23. Java多線程渲染,如何優化
- 24. 渲染優化和兄弟選擇器
- 25. 在Three.js中優化地形渲染
- 26. 優化渲染到紋理的過程
- 27. 在ActionScript 3中優化渲染
- 28. 優化瀏覽器文本渲染
- 29. 使用GPU加速優化渲染Webkit
- 30. Refactor Me:Backbone.js子視圖渲染優化
我發現用信息重載用戶是件壞事。你真的必須一次向他們展示成千上萬的東西嗎? –
@Simon我的客戶有這些要求。在測試過程中,我發現幾乎不可能監控所有控件。在我的選擇中,最佳的控件數量約爲300-500。但渲染和縮放的問題仍然存在。 – user2250152
您需要爲這些所有元素提供鍵盤和鼠標支持嗎?如果不是,您可以使用可視圖層並使用DrawingVisual類或其他較低級別的對象繪製「元素」。 – Jan