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
この問題または回避策を克服する方法はありますか? ありがとう。
アップデート
返事が遅れて申し訳ありません。MicrosoftによるWindowsタイマーの解決の説明は次のとおりです。
システム タイマーの解像度によって、Windows が次の 2 つの主要なアクションを実行する頻度が決まります。スケジュールされたタイマー オブジェクトが期限切れになっているかどうかを確認します。
デフォルトでは、Windows タイマーの解像度は 15.6 ミリ秒ですが、任意のプログラムでそれを下げるように要求できるため、バッテリーの消耗に大きな影響を与えます。たとえば、Chrome と vlc は、タイマーの解像度を下げることで認識されます。
最近、wpf アニメーションを再生すると、アニメーションの同期に使用される内部クロックが原因で、タイマーの解像度が 1ms に低下することがわかりました (私は推測します)。アニメーションが停止すると、タイマーの解像度は通常の値に戻りますが、再生中は CPU 消費が大幅に増加します。また、アニメーションに設定したフレームレートもこれには影響しません。
これを防ぐ方法はないかと思っていましたが、残念ながらこれは WPF の既知の問題であり、解決する方法はありません。
最後に、ディスパッチャ タイマーを使用して独自のプログラム アニメーションを使用しています。これは、タイマーの解像度に影響を与えず、驚くほど多くの CPU を消費しませんが、レンダー スレッドのワークロードに依存するため、スムーズではありません。
詳細については、こちらをご覧ください。
https://randomascii.wordpress.com/2013/07/08/windows-timer-resolution-megawatts-wasted/