UI線程是WP7中的Silverlight應(yīng)用程序的主線程,其功能和Silverlight瀏覽器插件的主線程很類似。以下列出了UI線程負責處理的任務(wù):
因為UI線程要負責處理用戶輸入、繪制新視圖、回調(diào)用戶代碼,所以要盡可能保證該線程空閑。維持一個輕型的UI線程是創(chuàng)建高響應(yīng)性應(yīng)用的關(guān)鍵。前面博文中的避免阻塞UI線程介紹了一些在應(yīng)用啟動時避免阻塞UI線程的方法。
構(gòu)圖線程會分擔一些通常由UI線程處理的工作,因此可以提高WP7上的Silverlight應(yīng)用程序的性能。構(gòu)圖線程合成了圖形紋理并將其遞交給GPU進行繪制。在WP7上的SIlverlight中,storyboard驅(qū)動的動畫運行在構(gòu)圖線程中,并且會被設(shè)備的GPU在一個稱為自動緩存的進程中自動緩存和處理。
構(gòu)圖線程會處理一些簡單的與RenderTransform和Projection屬性關(guān)聯(lián)的動畫。以下列表顯示了構(gòu)圖線程經(jīng)常書里的動畫。
注意:為了充分利用構(gòu)圖線程,縮放(scale)轉(zhuǎn)換必須小于原始大小的50%。
另外,P:System.Windows.UIElement.Opacity和P:System.Windows.UIElement.Clip屬性也是由構(gòu)圖線程處理的。然而,如果使用了Opacity mask或非矩形剪輯的話,這些操作將被傳遞給UI線程處理。
正如上文所言,storyboard驅(qū)動的動畫由構(gòu)圖線程處理。這是很完美的,因為構(gòu)圖線程會將這些遞交給GPU處理。另外,如果CPU超負荷時,構(gòu)圖線程比UI線程運行的更加頻繁。然而有些情況,storyboard動畫無法滿足應(yīng)用程序的需要。這時,應(yīng)當選擇在代碼中驅(qū)動動畫。這些動畫會被逐幀處理。很多情況下,這是合理的,但是你應(yīng)該知道在逐幀回調(diào)中運行動畫的影響。
逐幀回調(diào)嚴格的在UI線程中處理。動畫將會以UI線程能夠處理的速度進行更新,這就依賴于應(yīng)用程序正在執(zhí)行什么操作,動畫的呈現(xiàn)可能不會像運行在構(gòu)圖線程中一樣平滑。當在代碼中更新動畫時,元素不會像通過storyboard更新時一樣自動緩存。如果在這些元素中手動添加了位圖緩存,轉(zhuǎn)換和混合操作將會被遞交給GPU處理,但是動畫仍然是在逐幀回調(diào)中更新,由UI線程處理。這種情況下,動畫更新會和UI線程的幀頻一致。
為了避免復(fù)雜的處理阻塞UI線程,可以將這些處理卸載到輔助線程中,也就是在后臺線程中異步處理。例如,所有的Web Service的 API都被設(shè)計為異步處理以免他們阻塞UI線程。如果使用后臺線程,必須提供一種機制將后臺線程中的數(shù)據(jù)轉(zhuǎn)移到UI線程中。這既可以通過共享變量和事件進行數(shù)據(jù)傳遞,也可以使用M:System.Windows.Threading.Dispatcher.BeginInvoke(System.Action)方法將數(shù)據(jù)發(fā)送給UI線程。另外iayekeyi使用T:System.ComponentModel.BackgroundWorker類和其事件進行基于異步機制的處理。更多信息請參考How to: Use a Background Worker。