关于性能
一、 关于硬件加速
1、对于大多数图形硬件而言,大型图面是指达到 2048x2048 或 4096x4096 像素大小的图面。
二、 合理的布局
1、简单地说,布局是一个递归系统,实现在屏幕上对元素进行大小调整、定位和绘制。
2、集合中的子级数目越多,所需的计算量就越大
3、使用简洁的布局面板,Grid 或 StackPanel 控件提供的功能比 Canvas 控件多很多。 功能大大提高的代价是性能成本也大大提高。
4、更新而不替换 RenderTransform。
5、从上到下生成树。定义和添加元素时,采用自上向下的原则。
三、 二维图形和图像处理
1、使用绘图(Drawing)和形状(Shape),Drawing 对象比 Shape 对象结构简单并且性能特性更为优良。
2、图像:a、如果程序需要缩略图,应该显示创建缩略图。WPF会完成大小加载图像并进行解码。b、使用BitmapScalingMode.LowQuality属性通知 WPF 呈现引擎在处理图像时从质量优化算法切换到速度优化算法。
四、 对象行为
1、不移除对象的事件处理程序可能会使对象保持活动状态。对象传递给其事件的委托是对该对象的有效引用。 因此,事件处理程序可以使对象保持活动状态的时间超过预期时间。 当对已注册为侦听对象事件的对象执行清理时,在释放对象前移除委托是非常必要的。 将不需要的对象保持为活动状态会增加应用程序内存使用量。 当对象为逻辑树或可视化树的根时更是如此。
2、依赖属性的性能低于CLR属性。
3、使用Freezable对象。SolidColorBrush.Freeze()方法。冻结 Freezable 可以改进其性能,因为它不再需要因更改通知而消耗资源。冻结的 Freezable 也可以在线程之间共享,而解冻的 Freezable 则不能。
4、使用虚拟化。使用VirtualizingStackPanel
五、 资源共享
1、不进行复制而共享画笔;
2、尽可能使用静态资源; <Label Foreground="{StaticResource myBrush}">Label 1</Label>
六、 控件的性能
控件 |
虚拟化 |
容器回收 |
延迟滚动 |
可以启用 |
可以启用 |
可以启用 |
|
可以启用 |
可以启用 |
可以启用 |
|
不可用 |
不可用 |
可以启用 |
|
默认 |
可以启用 |
可以启用 |
|
默认 |
可以启用 |
可以启用 |
|
可以启用 |
可以启用 |
可以启用 |
|
不可用 |
不可用 |
可以启用 |
七、 其它方式
1、配置字体缓存服务以缩短启动时间;
2、画笔的不透明度与元素的不透明度,在使用 Brush 设置元素的 Fill 或 Stroke 时,设置 Brush.Opacity 值比设置元素的 Opacity 属性效果要好。 修改元素的 Opacity 属性会导致 WPF 创建临时图面。
3、避免使用 ScrollBarVisibility=Auto。
八、 启动时间
- 实现初始屏幕。当启动应用程序到显示第一个 UI 之间存在不可避免的明显延迟时,使用初始屏幕可优化感觉启动时间。
- 分析启动代码。确定冷启动慢的原因。磁盘 I/O 可能是一个原因,但并非总是它。 通常,应该将外部资源(例如网络、Web 服务或磁盘)的使用降到最低。在测试之前,验证没有其他正在运行的应用程序或服务使用托管代码或 WPF 代码。
- 优化模块加载。使用进程资源管理器 (Procexp.exe) 和 Tlist.exe 等工具可确定应用程序需加载哪些模块。 Tlist <pid> 命令显示进程加载的所有模块。例如,如果您没有连接到 Web 但看到加载了 System.Web.dll,则应用程序中存在引用此程序集的模块。请检查以确保该引用是必需的。如果应用程序有多个模块,请将它们合并为一个。 此方法需要的 CLR 程序集加载开销更少。程序集越少,还意味着 CLR 保持的状态也越少。
- 推迟初始化操作。
- 以编程方式设置数据绑定。不要使用 XAML 以声明方式设置主窗口的 DataContext,而应考虑以编程方式在 OnActivated 方法中对其进行设置。
6、WIN7的SuperFetch功能。Windows Vista 中的内存管理器包含一种称为 SuperFetch 的技术。 SuperFetch 分析内存在一段时间中的使用模式,以确定适合具体用户的最佳内存内容。 SuperFetch 会持续工作以便始终保持该内容。预提取技术是将数据预先加载到内存中而不分析使用模式。 随着时间的推移,如果用户经常在 Windows Vista 上使用 WPF 应用程序,则可能会缩短应用程序的冷启动时间。