WPF中的任何动画都会使请求的计时器分辨率为1毫秒,低于Windows默认的15.6毫秒,这会导致任何动画运行时电池耗尽。我使用.net 4.5并在Windows 10中运行,但它也发生在Windows 7和8中。
这是我的代码:
<Ellipse x:Name="Dash1" RenderTransformOrigin="0.5,0.5" Height="100" Width="100" StrokeDashArray="10" Stroke="Black">
<Ellipse.Triggers>
<EventTrigger RoutedEvent="Rectangle.Loaded">
<BeginStoryboard>
<Storyboard RepeatBehavior="Forever" Timeline.DesiredFrameRate="30">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)" Storyboard.TargetName="Dash1">
<EasingDoubleKeyFrame KeyTime="0:0:5" Value="360"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Ellipse.Triggers>
<Ellipse.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform/>
<TranslateTransform/>
</TransformGroup>
</Ellipse.RenderTransform>
</Ellipse>
要检查所请求的计时器分辨率,请在以管理员身份运行的命令提示符中运行以下命令并检查结果:
powercfg /energy
有没有办法克服这个问题或任何解决方法?感谢。
更新
很抱歉迟到的回复。 Windows计时器解析说明由Microsoft提供:
系统计时器分辨率决定Windows执行两个主要操作的频率:如果已经过完整刻度,则更新计时器滴答计数。检查计划的计时器对象是否已过期。
默认情况下,Windows计时器分辨率为15.6ms,但任何程序都可以请求降低它,这会对电池耗尽造成严重影响。例如,Chrome和vlc通过降低计时器分辨率而闻名。
最近我发现任何wpf动画播放都会将定时器分辨率降低到1ms,因为它用来同步动画的内部时钟(我假设)。当动画停止时,计时器分辨率恢复到正常值,但在播放CPU消耗时会大幅增加。你在动画上设置的帧率对此也没有影响。
我想知道是否有任何方法可以防止这种情况发生,但我担心这是WPF中的一个已知问题,而且无法解决它。
最后,我使用自己的编程动画和调度程序计时器,这不会影响计时器的分辨率,并且令人惊讶的是不会消耗尽可能多的cpu,但由于它们依赖于在渲染线程工作量上。
您可以在此处找到更多相关内容:
https://randomascii.wordpress.com/2013/07/08/windows-timer-resolution-megawatts-wasted/