0

私はWPFアプリケーションを持っています。ほとんどの場合、アプリはほとんど CPU を使用しません。これはいい。しかし、特定の状況下でポップアップするこの 1 つのウィンドウがあります。Visual Studio で実行したパフォーマンス分析によると、私のコードは CPU をあまり使用していません。Application.Run メソッドは使用しています。そしてそのほとんどが「Functon Body」にあります。CPUの40〜50%のように調整します。

CPU を使用しているものを特定するにはどうすればよいですか? いくつかのものの色をアニメーション化するキー フレームを使用したアニメーションがいくつかあります。それらがCPUを食い尽くしているのだろうかと思っています。それらを一時的に削除できることはわかっていますが、そうするかもしれませんが、何が CPU を消費しているのかを正確に把握する別の方法はありますか?

トニー

PS: それがアニメーションであったことを証明するために、タスク マネージャーで自分のプログラムの CPU 使用率を調べました。アニメーション付きのウィンドウが表示される前は約 0 でした。ウィンドウが表示され、CPUが上がりました。次に、データの状態を変更し、アニメーションを停止するという副作用があるボタンを押しました。CPU が 0 に戻りました。これを数回繰り返したところ、一貫した結果が得られました。私にはアニメーションのように見えます。アニメーションと同時に進行している別の可能性もありますが。

アニメーションは、点滅するライトをシミュレートするためのキー フレーム アニメーションです。キー フレーム アニメーションをダンプし、タイマーを使用して塗りつぶしブラシの色を 2 つの色の間で交換します。

PS: 興味のある方は、WPF アニメーションについて少し調べてみたところ、WPF には少なくとも 2 つの異なるカラー アニメーション キーフレーム クラスがあることがわかりました。私が使用していたもの、LinearColorKeyFrame は、アニメーションの期間中、色を現在の色から希望する色に連続的に変化させます。もう 1 つは DiscreteColorKeyFrame です。これにより、現在の色から希望する色に即座に変更されます。

だから私はこれからアニメーションを編集しました:

<Storyboard x:Key="FlashingStoryboard" AutoReverse="True" RepeatBehavior="Forever">
    <ColorAnimationUsingKeyFrames BeginTime="00:00:00" 
                                  Storyboard.TargetName="Flasher" 
                                  Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)">
        <LinearColorKeyFrame KeyTime="00:00:00.5" 
                             Value="{Binding Path=FlashColor, RelativeSource={RelativeSource AncestorType={x:Type local:Flasher}}}"/>
    </ColorAnimationUsingKeyFrames>
    <DoubleAnimation Duration="00:00:00.5" 
                     From="0" To="10" 
                     Storyboard.TargetName="FlasherBlur" 
                     Storyboard.TargetProperty="Radius">
    </DoubleAnimation>
</Storyboard>

これに:

<Storyboard x:Key="FlashingStoryboard" AutoReverse="True" Duration="00:00:00.5" RepeatBehavior="Forever">
    <ColorAnimationUsingKeyFrames BeginTime="00:00:00" 
                                  Storyboard.TargetName="Flasher" 
                                  Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)">
        <DiscreteColorKeyFrame KeyTime="00:00:00.25"
                               Value="{Binding Path=FlashColor, RelativeSource={RelativeSource AncestorType={x:Type local:Flasher}}}" />
    </ColorAnimationUsingKeyFrames>
</Storyboard>

新しいアニメーションでは、CPU の使用量が大幅に削減されています。CPU 使用率のほとんどが、光るエフェクトを生成していた DoubleAnimation によって占有されていることが判明しました。CPU のほぼ 1/2 を使用しました。まったく価値がありません。それを取り除いても、CPU 使用率は平均で約 15% のままでした。DiscreteKeyFrame に切り替えると、10% 未満になりました。

同じウィンドウ内の ListBox 内の項目の周囲の境界線をアニメーション化する別の同様のアニメーションがありました。同じ変更を加えたところ、CPU 使用率は許容範囲内になりました。それが何なのか正確にはわかりませんが、以前よりもずっと良くなっています。

ありがとう。

4

2 に答える 2

2

はい、アニメーションは、誰もが最初に言うことです。また、どのくらいの大きさですか?ノンストップですか?画面の比較的大きな部分です。

于 2012-04-20T18:49:47.243 に答える
0

コードのプロファイリングを行い、最も多くの CPU リソースを消費するものを確認し、そのように調整する必要があります。

.NET プロファイリングの詳細については、こちらを参照してください。

于 2012-04-20T18:50:55.033 に答える