2015年1月15日木曜日

WPF/Silverlightのレンダリングについて

WPF/Silverlightのレンダリングについて、調べてみました。
デフォルトでアニメーションをすると、カクカクする場合があります。
また、DaraGridで大量データでも動作が遅くなります。
そのような場合は、レンダリングの仕組みを調べて、パラメータ設定などで
対応することができます。
例えば、アニメーションでは、Imageの滲みを解消できるようである。
Silverlightもできるのか、調べてみたところ、残念ながら、できるものとできないものがあるようです。


いくつかピックアップしてみました。
(1) デバイスに依存しないピクセル単位(dpi)でのレンダリングを行っている(Pixel Snapping)
   ・WPFでは、UIElement.SnapsToDevicePixelsで改善できる様子。
  しかし、Silverlightにはこのパラメータがない

(2) アニメーションは0.1秒で行っている(レンダリング)
(3) CPUとGPUでのレンダリングが可能
 SilverlightでGPUを使ったアニメーションに変更したら、滲みが改善できました。
 ただし、Macはうまくできませんんでした。
 どうやら、UI スレッドの停止がアニメーションを停止させないよう、アニメーションを GPU にキャッシュしてしているようです。

【SilverlightでのGPU使用方法】
・HTML以下記述
  <param name="EnableGPUAcceleration" value="true" />
・GUPを使用するUIElementにCacheMode="BitmapCache"を追加
 例) 
 <TextBlock x:Name="tbkTest" Width="50" Height="20" VerticalAlignment="Top" HorizontalAlignment="Right" 
                       Text="TA ブログ" FontSize="10"  CacheMode="BitmapCache">   
(4)RederOptionを使用する
・ベクトル描画は、WPFでアンチエイリアシングを無効にする
無効にするには、RenderOptions.EdgeMode="Aliased" を使います
・画像は、RenderOptions.BitmapScalingMode="NearestNeighbor"にすることです。すると最近点サンプリングをするため、ボケはなくなります。


もし、Siverlightのアニメーションで滲み(カクカクアニメーション)改善したい場合は、参考にしてください。


【参考URL】
http://msdn.microsoft.com/ja-jp/library/ms748373(v=vs.110).aspx
http://www.codeproject.com/Articles/784529/Solutions-for-WPF-Performance-Issue
http://msdn.microsoft.com/ja-jp/library/vstudio/aa970908(v=vs.90).aspx
http://news.mynavi.jp/column/silverlight/015/
http://blogs.msdn.com/b/hiroyuk/archive/2011/06/21/10177206.aspx
http://msdn.microsoft.com/ja-jp/library/bb613591(v=vs.110).aspx

0 件のコメント:

コメントを投稿