WPFは非常に高機能ですが、扱い方を間違えると大火傷を負います。
簡単にですが、頭の片隅に残しておくべきWPFのパフォーマンス関連の記事をまとめました。
##はじめに
###MSDN
まず気をつけるべきことが記載されています。にしても結構なボリューム。。
・
https://docs.microsoft.com/dotnet/desktop/wpf/advanced/optimizing-wpf-application-performance
・https://docs.microsoft.com/previous-versions/msp-n-p/ff647792(v=pandp.10)
##気をつけるべき10のことみたいなやつ
###WPFアプリのパフォーマンスを良くする10の方法
- BitmapImageのスケールを小さくしろ
- FlowDocument内にTextBlock使わないでRun使え
- DynamicResourceではなくStaticResource使え
- でかいオブジェクトを描画したい場合はUI Virtualization(仮想化) 使え
- リッチじゃないUIだったらScrollは Deferredを指定せよ
- 起動時間を速くさせたいなら、PresentationFontCache Serviceを起動させておけ
- 不要になったアニメーションはUnloadedイベントでRemoveせよ
- Containerのプロパティは可能であればRecycle使え
- ハードウェアレンダリングかソフトウェアレンダリングかの識別はRenderCapability.Tier使えばできるよ
- 調査用ツールを使え
###WPFのパフォーマンスを改善する12の方法
・http://pelebyte.net/blog/2011/07/11/twelve-ways-to-improve-wpf-performance/
- Binding Errorを回避せよ( PrismのBindingBaseBindableBase/NotificationObjectであればデバッグ時にVisual Studioのデバッグ出力ウィンドウに警告が出力されます)
- 可能であれば高さと幅は固定にしろ(XAML上にハードコードしろ)
- CollectionViewのGrouping機能は使うな
- コレクション(ObservableCollection) への変更通知を最適化せよ (ObservableCollectionは要素をAddするたびに変更通知走っちゃう )
- DynamicResourceは避けよ
- ResourceDictionaryは避けよ ResourceDictionaryを生成するのはすごいコストだぜ
- Visual Treeを Simpleに保て
- System.Windows.Interactivity.Behavior.OnDetachingは呼ばれないことがあるので注意してください
- いくつかの理由により、DependencyPropertyDescriptorは使うな
- ViewModelのイベントに注意せよ(WeakEventManager使ってリークしないようにしようね)
- でかいデータを取得するならDispatcher.BeginInvokeで(よくわからないが非同期処理しろってことかな)
- メモリリークに常に注意を払え
WPFパフォーマンス 10Tips
- BackgroundWorkerなりBeginInvokeなりで処理しろ
- Binding Errorを回避せよ
- Visual の数を減らせ(Visual TreeをSimpleに保て )
- ソフトウェアレンダリングを防げ
- Resourceは必要になったときに読め
- 仮想化せよ(VirtualizingStackPanel利用のところは)
- Containerのプロパティは可能であればRecycle使え
- FreezeできるところはFreezeしろ(PresentationOptions:Freeze="true")
- アセンブリのロケーションをDisableに
- アニメーションのフレームレートを下げろ
- PathGeometriesじゃなくてStreamGeometriesを使え
##調査用ツール
###WPF Performance Suite レンダリング関連に強い。
・https://msdn.microsoft.com/ja-jp/library/aa969767%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396
###Snoop WPFオブジェクトのバインディングなど
・https://snoopwpf.codeplex.com/
このサイトが詳しいです!
###Memory Leak 調査用
・http://blogs.msdn.com/b/jgoldb/archive/2008/02/04/finding-memory-leaks-in-wpf-based-applications.aspx
###Resharper Binding ErrorなどをVisual Studio上で提示してくれる・・・が有料。
・http://www.jetbrains.com/resharper/features/xaml_editor.html
XAMLのBinding Errorの調査に活用。
##ResourceDictionary遅い
・http://leecampbell.blogspot.jp/2010/05/mergeddictionaries-performance-problems.html
##レンダリング
・http://www.codeproject.com/Articles/784529/Solutions-for-WPF-Performance-Issue
・http://kynosarges.org/WpfPerformance.html
・http://blog.xamlwonderland.com/
##コンバーター
・http://stackoverflow.com/questions/7347911/converter-best-practice-for-better-performance
##メモリリーク
・https://atomaras.wordpress.com/2012/04/23/solving-mvvmlights-eventtocommand-memory-leak-wp7/
##画像(Image/BitmapImage)関連
・http://d.hatena.ne.jp/fkmt5/20130729/1375090831
・http://code.logos.com/blog/2008/04/memory_leak_with_bitmapimage_and_memorystream.html
##バインディング関連
・http://stackoverflow.com/questions/7687000/fast-performing-and-thread-safe-observable-collection
・https://support.microsoft.com/ja-jp/kb/938416/en-us?wa=wsignin1.0
##特定のコントロールに特化
###DataGrid
・http://stackoverflow.com/questions/11379357/wpf-net-4-datagrid-column-performance
###xamDataGrid
・http://www.infragistics.com/community/blogs/kiril_matev/archive/2010/10/26/optimizing-xamdatagrid-performance.aspx
・http://www.infragistics.com/community/forums/t/48307.aspx
・http://www.infragistics.com/community/forums/t/68474.aspx
・http://www.infragistics.com/community/forums/t/43169.aspx
##最後の手段(ProgressBar/SplashWindow)関連
・http://www.codeproject.com/Articles/35288/WPF-Circular-Progress-Bar
・http://romenlaw.blogspot.jp/2008/07/wpf-splash-with-progressbar.html
・http://www.codeproject.com/Articles/38291/Implement-Splash-Screen-with-WPF
・http://stackoverflow.com/questions/22026209/wpf-splashscreen-with-progressbar
##.NETアプリケーションの起動時間短縮方法
https://msdn.microsoft.com/ja-jp/library/cc656914%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396
いやー、色々注意しないといけないですね。
本当に難しい。WPF+XAML。