我已使用XPerf來幫助跟蹤與Silverlight中重繪相關的性能問題。它不是一個完全簡單或簡單的過程,但它可以幫助您指出問題所在的正確方向。
我從great tutorial by Seema開始使用XPerf命令行工具來分析Silverlight應用程序的CPU使用情況。您基本上可以加載應用程序,使用XPerf開始採樣,執行CPU密集型操作,然後停止採樣並分析XPerf生成的配置文件。當您查看XPerf圖表時,您可以選擇可以通過某些過程(例如iexplorer或瀏覽器)進行過濾以查看總CPU百分比。然後,您可以在配置文件中選擇特定的時間長度,並深入瞭解哪些DLL佔用的CPU週期最多。如果您將XPerf指向Microsoft的符號服務器,則應該獲取應用程序花費大部分時間的功能的具體名稱。
對於Silverlight應用程序是最重要的看發生了什麼事在agcore.dll,npctrl.dll和coreclr.dll。如果您的性能問題與重新繪製有關,則大部分CPU時間可能會花費在agcore.dll之上,因爲它會完成Silverlight的大多數圖形相關工作。然後,您可以深入瞭解並在您的採樣時間內看到最經常調用的agcore.dll中的特定功能。
我知道這是一種煩人的調試方式,因爲您只能真正瞭解核心Silverlight函數中發生了什麼,但它可能能夠幫助您弄清楚發生了什麼。在我的情況下,我能夠看到大部分時間都花在計算agcore.dll中的陰影。然後,我能夠弄清楚我在每秒變化很多次的陰影效果內有一些內容,導致整個陰影效果的重新計算/重繪。
一旦確定了重繪問題,如果您尚未使用BitmapCaching,則可能需要查看GPU Acceleration。這將有助於卸載一些重繪到GPU併爲您節省一些CPU週期。
我也看到ListBoxDragDropTarget的可怕表現。你能弄清楚這一點嗎?見http://silverlight.codeplex.com/workitem/8021 – 2011-01-03 05:37:17
沒關係。我從其中一位父母處刪除了DropShadowEffect。 – 2011-01-03 06:29:41