WPF动画播放时出现的优秀计时器请求

时间:2016-02-22 04:21:27

标签: wpf windows wpf-animation

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,但由于它们依赖于在渲染线程工作量上。

您可以在此处找到更多相关内容:

http://download.microsoft.com/download/3/0/2/3027d574-c433-412a-a8b6-5e0a75d5b237/timer-resolution.docx

https://randomascii.wordpress.com/2013/07/08/windows-timer-resolution-megawatts-wasted/

0 个答案:

没有答案