0

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,但由于它们取决于渲染线程的工作负载,所以并不那么流畅。

您可以在此处找到有关此内容的更多信息:

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/

4

0 回答 0