调试ListBoxDragDropTarget(Silverlight Toolkit)上的性能问题?

时间:2010-06-09 15:39:46

标签: c# silverlight debugging silverlight-4.0

我有一个复杂的项目,使用SilverLight Toolkit的ListBoxDragDropTarget进行拖放操作,并且它最大化了CPU。我试图在一个小的示例项目中重现该问题,但它工作正常。当我从页面中删除自定义样式和所有其他控件时,问题仍然存在,但页面托管在另一个页面的ScrollView中。

“EnableRedrawRegions”显示每帧重绘屏幕。我的问题是:如何找出不断重绘的原因?

1 个答案:

答案 0 :(得分:2)

我使用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周期。