やる気駆動型エンジニアの備忘録

WPF(XAML+C#)の話題を中心に.NET/Android/CI やたまに趣味に関するブログです

WPFパフォーマンス改善その2.アニメーションのパフォーマンス改善策

ここではWPF のアニメーションの動作改善策について記述します。

WPF のアニメーションは簡単に作成できる反面、最適化を実施しない場合だと無制限にCPU/GPU パワーを使用し続けます。
アニメーションにリソースを割かれると、それにともなって他のユーザーコントロールの動作も遅くなります。

■アニメーションが遅くなる要因

  アニメーションが遅くなる要因はおおよそ以下が原因であることが多いです。

・アニメーション対象の要素の数が多すぎる。
  ⇒動作環境に依存しますが、同時に100個以上の要素はアニメーションさせるべきではありません。

・アニメーション対象の要素の描画領域が広すぎる。
  ⇒上記の要因と似通っていますが、アニメーションする描画領域が広いとそれだけGPU パワーを使用します。

・Shape 系コントロールをアニメーションさせている。
  ⇒Shape 系コントロールは描画するだけで高負荷がかかります。
   アニメーション処理までさせようとするとあっという間にCPU 使用率が上限に達します。

・フェードアニメーションは高負荷
  ⇒具体的には"Opacity" プロパティを変動させるアニメーションのことです。
   Brush のOpacity についても同様です。
   代用策として、Visibility を切替える点滅アニメーションの使用を検討して下さい。

■アニメーションの動作を改善する方法

  前提条件として、[アニメーションが遅くなる要因] の対策を実施して下さい。

・アニメーションのフレームレートを落とす。
  ⇒アニメーションはデフォルトで60FPS で処理されます。
   この処理が追いつかなくなると、動作が重くなります。
   StoryBoard にはこのフレームレートを任意の数値に設定することが可能です。
   (参考: http://www.wpftutorial.net/FrameRate.html )
   デメリットとしてアニメーションがカクつくように見えます。