Выдающийся запрос таймера при воспроизведении анимации WPF
Любая анимация в WPF запрашивает разрешение таймера 1 мс, что ниже, чем значение по умолчанию, равное 15,6 мс в Windows, что приводит к разрядке батареи во время работы любой анимации. Я использую.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,6 мс, но любая программа может запросить его понижение, что сильно влияет на разряд батареи. Например, Chrome и vlc известны уменьшением разрешения таймера.
Недавно я обнаружил, что любая анимация wpf проигрывает разрешение таймера до 1 мс, из-за внутренних часов, которые он использует для синхронизации анимации (я полагаю). Когда анимация останавливается, разрешение таймера возвращается к нормальному значению, но во время воспроизведения потребление процессора резко возрастает. И частота кадров, которую вы устанавливаете для анимации, также не влияет на это.
Мне было интересно, есть ли способ предотвратить это, но я боюсь, что это известная проблема в WPF, и нет способа ее решить.
В конце я использую свои собственные программные анимации с диспетчерским таймером, который не влияет на разрешение таймера и на удивление не потребляет столько процессора, но не так гладко, так как зависит от рабочей нагрузки потока рендеринга.
Вы можете найти больше чтения об этом здесь:
https://randomascii.wordpress.com/2013/07/08/windows-timer-resolution-megawatts-wasted/