我有一个WPF应用程序。大多数情况下,该应用程序几乎不使用CPU。这很好。但我有一个窗口在特定情况下弹出。根据我在Visual Studio中运行的性能分析,我的代码没有使用很多CPU,Application.Run方法是。其中大部分都在“Functon Body”中。达到40%-50%的CPU。
我如何弄清楚CPU耗尽了什么?我有一些动画使用关键帧来动画某些东西的颜色。我想知道他们是不是正在吃掉CPU。我知道我可以暂时删除它们,我可能会这样做,但还有另一种方法可以确切地知道CPU正在吃什么吗?
贝
PS:为了向自己证明这是动画,我在任务管理器中查看了我的程序的CPU使用情况。在显示动画的窗口之前大约为0。窗口显示& CPU上升了。然后我按下了一个改变数据状态的按钮。有停止动画的副作用。 CPU重新回到0.我重复了几次,结果一致。看起来这是我的动画。虽然它有可能是与动画同时发生的其他事情。动画是用于模拟闪光的关键帧动画。我将转储关键帧动画,并使用计时器在两种颜色之间交换填充画笔颜色。
PS:如果有人有兴趣,我对WPF动画做了一些研究,我发现WPF中至少有2个不同的Color Animation KeyFrame类。我正在使用的那个,LinearColorKeyFrame,在动画的持续时间内,不断改变颜色,无论你想要的是什么。另一个是DiscreteColorKeyFrame。这会立即将颜色从任何颜色变为您想要的颜色。所以我从这里编辑了我的动画:
<Storyboard x:Key="FlashingStoryboard" AutoReverse="True" RepeatBehavior="Forever">
<ColorAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="Flasher"
Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)">
<LinearColorKeyFrame KeyTime="00:00:00.5"
Value="{Binding Path=FlashColor, RelativeSource={RelativeSource AncestorType={x:Type local:Flasher}}}"/>
</ColorAnimationUsingKeyFrames>
<DoubleAnimation Duration="00:00:00.5"
From="0" To="10"
Storyboard.TargetName="FlasherBlur"
Storyboard.TargetProperty="Radius">
</DoubleAnimation>
</Storyboard>
对此:
<Storyboard x:Key="FlashingStoryboard" AutoReverse="True" Duration="00:00:00.5" RepeatBehavior="Forever">
<ColorAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="Flasher"
Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)">
<DiscreteColorKeyFrame KeyTime="00:00:00.25"
Value="{Binding Path=FlashColor, RelativeSource={RelativeSource AncestorType={x:Type local:Flasher}}}" />
</ColorAnimationUsingKeyFrames>
</Storyboard>
新动画使用的CPU少得多。事实证明,大多数CPU使用都被DoubleAnimation占用,这产生了一种发光效果。它耗尽了近一半的CPU!根本不值得。即使我删除了它,CPU使用率仍然平均约为15%。将它切换到DiscreteKeyFrame使其降低到10%以下。
在同一个窗口中,ListBox中的项目周围有另一个类似的动画动画。我做了相同的更改,现在CPU使用率是可以接受的。我不确定它是什么,但它比现在更好。
感谢。
答案 0 :(得分:2)
答案 1 :(得分:0)
您需要进行代码分析,看看什么消耗了大部分CPU资源,并且可能会调整这种方式。
您可以阅读有关.NET分析here
的更多信息