2010-06-09 89 views
1

我有一個使用SilverLight Toolkit的ListBoxDragDropTarget進行拖放操作的複雜項目,它最大限度地利用了CPU。我試圖在一個小樣本項目中重現這個問題,但後來它工作正常。當我從頁面中刪除我們的自定義樣式和所有其他控件時,問題仍然存在,但該頁面被託管在另一個頁面的ScrollView中。調試ListBoxDragDropTarget(Silverlight Toolkit)上的性能問題?

「EnableRedrawRegions」顯示屏幕在每一幀都被重新繪製。我的問題是這樣的:我如何追蹤這個不斷重繪的原因?

+0

我也看到ListBoxDragDropTarget的可怕表現。你能弄清楚這一點嗎?見http://silverlight.codeplex.com/workitem/8021 – 2011-01-03 05:37:17

+0

沒關係。我從其中一位父母處刪除了DropShadowEffect。 – 2011-01-03 06:29:41

回答

2

我已使用XPerf來幫助跟蹤與Silverlight中重繪相關的性能問題。它不是一個完全簡單或簡單的過程,但它可以幫助您指出問題所在的正確方向。

我從great tutorial by Seema開始使用XPerf命令行工具來分析Silverlight應用程序的CPU使用情況。您基本上可以加載應用程序,使用XPerf開始採樣,執行CPU密集型操作,然後停止採樣並分析XPerf生成的配置文件。當您查看XPerf圖表時,您可以選擇可以通過某些過程(例如iexplorer或瀏覽器)進行過濾以查看總CPU百分比。然後,您可以在配置文件中選擇特定的時間長度,並深入瞭解哪些DLL佔用的CPU週期最多。如果您將XPerf指向Microsoft的符號服務器,則應該獲取應用程序花費大部分時間的功能的具體名稱。

對於Silverlight應用程序是最重要的看發生了什麼事在agcore.dllnpctrl.dllcoreclr.dll。如果您的性能問題與重新繪製有關,則大部分CPU時間可能會花費在agcore.dll之上,因爲它會完成Silverlight的大多數圖形相關工作。然後,您可以深入瞭解並在您的採樣時間內看到最經常調用的agcore.dll中的特定功能。

我知道這是一種煩人的調試方式,因爲您只能真正瞭解核心Silverlight函數中發生了什麼,但它可能能夠幫助您弄清楚發生了什麼。在我的情況下,我能夠看到大部分時間都花在計算agcore.dll中的陰影。然後,我能夠弄清楚我在每秒變化很多次的陰影效果內有一些內容,導致整個陰影效果的重新計算/重繪。

一旦確定了重繪問題,如果您尚未使用BitmapCaching,則可能需要查看GPU Acceleration。這將有助於卸載一些重繪到GPU併爲您節省一些CPU週期。