Silverlight性能優化紀要

Silverlight性能優化紀要-原作者Jossef Goldberg

 

 

    Silverlight作爲微軟爲富網絡應用所做的一個全新的架構,其優秀的表現力讓開發者和用戶感受到了強烈的衝擊,無數的開發者爲其着迷,同時微軟的廣大設計者也在不斷地爲其完善和充實,同時Silverlight團隊也積極的構建Silverlight 5,其初步的版本已在 http://channel9.msdn.com/Series/Silverlight-Firestarter做了演示,從中你可以感受到Silverlight未來之路。我在學習了裏面的性能優化的Event後,對這部分的介紹做了一個摘要,希望給大家簡單的瞭解。

   性能優化是一個逐步迭代的過程,在此過程中你需要做到以下的工作:

    1、明確哪些關鍵的步驟對性能優影響;

    2、制定清晰地目標;

    3、經常並儘早的進行性能測試;

    4、對新加入的新特性進行監視;

    5、在最終的部署環節進行測試。

一、 Sivlerlight 啓動時的優化:

    減少XAP包的下載量;儘量去除不必要的XAML標記以減少解析時間;使用延遲加載的方式來減少和磁盤IO的交互以及使用歡迎頁面來提高加載時的用戶體驗。

1

  在這兒Jossef Goldberg還提供了動態下載XAP包的關鍵代碼範例[DataGrid控件的優化]:

    由於DataGrid控件庫沒有在提供在Silverlight核心庫中,所以在我們的程序中如果使用該控件,則加載相應的大約144KB的SDK控件庫,因此如果你的應用程序並沒有在程序一開始就使用到DataGrid控件,那麼我們就可以使用延遲下載和動態加載的方式。

   具體的步驟和代碼如圖:

2

二、運行時的優化性能:

   1、減少頁面重繪;

      a:減少頁面的更新  

        Silverlight僅在頁面爲“髒”的部位進行重繪,因此我們可以減少使用大篇幅的動畫;關閉頁面中隱藏的動畫及注意控件的默認動畫行爲。

      b:直接更新頁面

       這可以通過設置Silverlight對象的兩個頁面參數來實現,即enableRedrawRegions 和enableFrameRateCounter :

       相應的設置如下:

       <param name="enableRedrawRegions" value="true" />

       <param name="enableFrameRateCounter" value="true"/>

  2、小心使用Effects;

    由於使用酷效果可以增強程序的表現力,所以很多的設計人員喜歡使用它,不過使用Effects會給我們的應用程序帶來性能問題,因爲Effects是CPU計算來呈現,不能獲得GPU的運算處理的好處,所以要儘量少用。如果使用Effects還得注意不要對Effects的屬性進行動畫修改,或者將其用到動畫部件上,同時將Effects應用到子節點上。

   3、使用GPU加速;

   由於Silverlight可以使用位圖緩存,緩存的位圖使用於GPU內存,所以位圖緩存可以通過GPU加速。下列元素可以使用GPU加速:Render Transforms(變換);Opacity(透明度);Rectangular Clip(矩形剪切);Projects(透視).其他如Effects(效果)、Opacity Mask(透明掩碼)、Non-rectangular Clips(非矩形剪切)只能依靠CPU呈現。

  使用GPU加速的步驟有

   1)、在插件級設置爲允許GPU加速

    <param name=“EnableGPUAcceleration” value="true"/>

   2)、在元素級設置允許位圖緩存

    <StackPanel CacheMode="BitmapCache“ … >

   3)、優化操作:控制緩存位圖的尺度或者數量(數量等同於內存,特別使用於縮放的場景)

    <BitmapCache RenderAtScale=“2" .../>

    那麼什麼時候使用BitmapCache呢,一般來說呈現元素多的昂貴操作如:GPU能對他們的屬性進行動畫以及用戶可以明顯感覺到性能影響的情況下可以考慮使用它。對於大幅面的視覺元素不要使用BitmapCache,因爲GPU緩存不夠用時會使用軟件來模擬,那樣反而適得其反;如果子元素也有動畫師也不要使用BitmapCache,因爲使用緩存時會把所有的子元素本身也加入到緩存中。

4、簡化XMAL標記(減少視覺樹的複雜度);

   1)、可視樹越小就越快:屬性、排列、綁定、輸入、樣式都會加大開銷,同時小樹讓事件的路由更快,內存使用更少,程序設計中也容易計量元素的數量。

   2)、警惕模板擴張:設計器的模板可能是你的視覺樹爆炸性的增長。由於用戶控件會試圖解析每一個實例,這使得開銷加大,這是我們應該使用模板而不是用戶控件。

   3)、無用的子樹的處理:移除長時間不用的子數,將Visibility=“Collapsed”替代Opacity=“0” ,因爲前者不會分配實例。

5、避免UI線程阻塞;

    Silverlight共享瀏覽器的UI線程,包括:動畫、排列、事件、用戶輸入、App代碼,而幀柵格化、媒體解碼、GPU工作都不使用UI線程。而且只有UI線程能進入到XAML對象中。

    對於耗時的操作都可能影響到你的動畫、輸入、排列等頁面呈現,這是我們可以採用以下的兩種方式來避免這些耗時的操作阻塞你的UI呈現: 

   1)、把這些長任務它放入到獨立的代碼塊中,然後使用Dispatcher.BeginInvoke() 進行異步調用;

   2)、也可以使用BackgroundWorker多線程處理機制,因爲它擁有內建的報告進度和取消操作的功能。

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