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 计时器分辨率解释是:
系统计时器分辨率决定了 Windows 执行两个主要操作的频率: 如果一个完整的滴答已经过去,则更新计时器滴答计数。检查定时定时器对象是否过期。
默认情况下,Windows 计时器分辨率为 15.6 毫秒,但任何程序都可以请求降低它,这会对电池消耗造成很大的影响。例如 Chrome 和 vlc 通过降低计时器分辨率而闻名。
最近我发现播放任何 wpf 动画都会将计时器分辨率降低到 1ms,因为它使用了内部时钟来同步动画(我假设)。当动画停止时,计时器分辨率恢复到正常值,但在播放时 CPU 消耗急剧增加。您在动画上设置的帧率也对此没有影响。
我想知道是否有任何方法可以防止这种情况发生,但恐怕这是 WPF 中的一个已知问题,没有办法解决它。
最后,我将自己的程序动画与调度程序计时器一起使用,这不会影响计时器的分辨率,并且令人惊讶的是它不会消耗太多的 cpu,但由于它们取决于渲染线程的工作负载,所以并不那么流畅。
您可以在此处找到有关此内容的更多信息:
https://randomascii.wordpress.com/2013/07/08/windows-timer-resolution-megawatts-wasted/