Silverlight Virtualization Overview

當ListBox使用StackPanel作爲容器時,如果數據源包含大量數據時,每一條數據都要創建可視化的Item來承載數據,創建這些容器就需要消耗很多時間和內存,另外滾動也非常慢,因爲需要計算所有這些Item的大小和位置

如下圖所示是ListBox在默認情況下加載10000個Gamer(只定義了Id和Name屬性)對象時,IE的內存使用情況,此時滾動非常順暢:
無標題

如果我們將ListBox的ItemsPanel修改爲StackPanel會如何呢?下圖是修改爲StackPanel後IE的內存使用情況,此時滾動已經非常緩慢:

無標題

295264k 對 56372k,大概在5倍左右的差距,很顯然ListBox默認使用的ItemsPanel不是StackPanel,而且可以很好的處理大量的數據加載,我們不用做任何的額外處理

對於這類問題目前有兩種解決方案:

UI virtualization

最佳的一種解決方案,其核心思想就是延遲生成每個Item,只有這些Item滾動到可視區域時才顯示這些Item,在Silverlight中UI virtualization是通過VirtualizingStackPanel來實現的,VirtualizingStackPanel計算哪些Item可見,然後只爲這些可見Item創建UI元素,這樣實際創建的UI元素非常少,內存消耗就少,每次滾動時,也不需要計算每個Item的大小和位置,只需要計算哪些Item可見,然後爲這些Item創建UI元素就可以了,滾動就非常順暢;VirtualizingStackPanel包含兩種模式:standard and recycling,standard模式就是每次Item進入可視區域都會重新創建UI元素,而recycling模式則會重用之前已經創建好的UI元素,使用該模式內存消耗更少,滾動更平滑

Data virtualization

其核心思想是不一次性加載所有數據,只加載用戶可以看到的數據,比如ListBox只加載滾到可視區域的數據,在Silverlight中實現Data virtualization主要是通過PagedCollectionView實現,PagedCollectionView提供分組、排序、過濾等許多功能,使用非常靈活、方便,其核心思想就是內部維護所有Item的集合,這個集合不會和ItemsControl進行綁定,將需要在界面中展示的那些數據包裝成另外一個集合,這個集合與ItemsControl進行綁定,因爲這個集合容量較小,所以實際上創建的UI元素非常少,節省內存,具體使用方法請參考MSDN,這裏不再贅述

其他

WPF中ScrollViewer提供了IsDeferredScrollingEnabled屬性支持Defer Scrolling,而Silverlight沒有暴露這個屬性不支持DeferScrolling

參考資料

http://www.silverlightshow.net/items/Virtualization-in-Silverlight-4-RC.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章