debugging 调试ListBoxDragDropTarget上的性能问题(Silverlight工具包)?

9bfwbjaz  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(136)

我有一个使用Silverlight Toolkit的ListBoxDragDropTarget进行拖放操作的复杂项目,它会使CPU达到最大。我尝试在一个小示例项目中重现此问题,但之后它运行正常。当我从页面中删除自定义样式和所有其他控件时,问题仍然存在,但该页面托管在另一个页面的ScrollView中。
“EnableRedrawRegions”显示屏幕在每一帧上都被重绘。我的问题是:我怎样才能找到这种不断重绘的原因呢?

2cmtqfgy

2cmtqfgy1#

我已经使用XPerf来帮助跟踪与Silverlight中的重绘相关的性能问题。这并不是一个完全直接或简单的过程,但它可以帮助您指出问题所在的正确方向。
我从一个great tutorial by Seema开始,介绍了如何使用XPerf命令行工具来分析Silverlight应用程序的CPU使用情况,您基本上可以加载应用程序,使用XPerf开始采样,执行CPU密集型操作,然后停止采样并分析XPerf生成的配置文件。(例如iexplorer或您的浏览器)来查看总的CPU百分比。然后您可以在设定档中选取特定的时间长度,并向下钻研来查看哪些DLL的哪些函式占用了最多的CPU周期。如果您将XPerf指向Microsoft'的符号服务器,您应该获得应用程序花费大部分时间的函数的具体名称。
对于Silverlight应用程序来说,最重要的是查看 * agcore.dll npctr.dll * 和 * coreclr.dll * 中发生了什么。如果您的性能问题与重绘有关,大部分CPU时间可能都花在 * agcore.dll * 上,因为它为Silverlight完成了大部分与图形相关的工作。然后,您可以深入查看 * agcore.dll * 中的特定函数在采样期间被调用次数最多的函数。
我知道这是一种令人讨厌的调试方式,因为您只能真正看到Silverlight核心函数中发生了什么,但它可能会帮助您弄清楚发生了什么。在我的情况下,我能够看到大部分时间都花在计算 * agcore.dll * 中的投影上。然后我能够发现我愚蠢地在一个投影中有一些内容-阴影效果每秒变化多次,导致整个投影效果不断重新计算/重画。
一旦你发现了你的重绘问题,你可能想看看GPU Acceleration与BitmapCaching(如果你还没有)。这将有助于卸载一些重绘到GPU,并保存一些CPU周期。

相关问题