代码之家  ›  专栏  ›  技术社区  ›  carlmon

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

  •  1
  • carlmon  · 技术社区  · 15 年前

    我有一个复杂的项目,使用Silverlight工具箱的ListBoxDragDropTarget执行拖放操作,它最大化了CPU。我试着在一个小样本项目中复制这个问题,但之后它就可以正常工作了。当我从页面中删除自定义样式和所有其他控件时,问题仍然存在,但页面宿主在其他页面的滚动视图中。

    “EnableReadrawRegions”显示在每一帧上重新绘制屏幕。我的问题是:我怎样才能找到这个常数重绘的原因?

    1 回复  |  直到 15 年前
        1
  •  2
  •   Dan Auclair    15 年前

    我已经用过 XPerf 帮助跟踪与Silverlight中重新绘制相关的性能问题。这不是一个完全简单或简单的过程,但它可以帮助你找到正确的方向去解决你的问题。

    我从一开始 great tutorial by Seema 关于使用xperf命令行工具来分析Silverlight应用程序的CPU使用情况。您基本上可以加载应用程序,使用xperf开始采样,执行CPU密集型操作,然后停止采样并分析xperf生成的配置文件。当您查看xperf图表时,您可以选择通过某些进程(如iexplorer或浏览器)进行筛选,以查看总CPU百分比。然后,您可以在概要文件中选择特定的时间长度,并向下钻取以查看哪些函数是DLL占用最多CPU周期的函数。如果您将xperf指向Microsoft的symbol server,您应该获得应用程序花费大部分时间的函数的特定名称。

    对于Silverlight应用程序,最重要的是查看 AGCOR.DLL , NPCTL.DLL 动态链接库 . 如果您的性能问题与重绘有关,那么大部分CPU时间可能都花在 AGCOR.DLL 因为这可以为Silverlight完成大多数与图形相关的工作。然后,您可以深入了解它并查看 AGCOR.DLL 在您的采样时间内最常被调用。

    我理解这是一种很烦人的调试方法,因为您只能真正看到核心Silverlight函数中正在发生的事情,但它可以帮助您了解正在发生的事情。在我的例子中,我可以看到大部分时间都花在计算 AGCOR.DLL . 然后我才发现自己愚蠢地在一个每秒变化很多次的阴影效果中有一些内容,并导致对整个阴影效果的不断重新计算/重画。

    一旦确定了重新绘制的问题,您就可能需要研究 GPU Acceleration 如果还没有的话,可以使用BitmapCaching。这将有助于将一些重绘卸载到GPU,并为您节省一些CPU周期。

    推荐文章