本文讲述使 Microsoft Silverlight 应用程序快速、流畅运行的性能小贴士。
主要性能提示:
- 多种平台和浏览器上的测试
- 在开发期间将 EnableFrameRateCounter 设置为 true
- Silverlight 插件尽量少用透明背景
- 使用 Silverlight 动画,而不是自己创建每帧组成的动画
- 避免对文字大小使用动画
- 避免使用 Windowless(无窗口)模式
- 将可能使用可见性而不使用不透明度
- Silverlight 使用多核呈现和媒体回放
- 在全屏模式下,隐藏不用的对象
- 不要对 MediaElement 对象使用 Width 和 Height 属性
- 不要对 Path 对象使用 Width 和 Height 属性
- 当 Downloader(下载器) 结束时,分离事件并设置为 null
- 将 CPU 密集的工作拆分成更小的任务
多种平台和浏览器上的测试
如果你正在为多种操作系统(例如 Macintosh 和 Windows)和多种浏览器(例如Microsoft Internet Explorer、Mozilla FireFox 和 Apple Safari)开发基于 Silverlight 的应用程序,千万要记住使用你要部署的操作系统和浏览器进行常规测试。不同系统和浏览器之间行为的不同和 Silverlight 处理这些行为的代码会影响程序性能。尤其是你的应用程序有嵌入的透明背景插件和使用大量 JavaScript 代码的时候,应当进行全面测试。
在开发期间将 EnableFrameRateCounter 设置为 true
插件的呈现性能随指定的宿主参数和内容的复杂程度而变化。我们推荐你在程序开发期间将 EnableFrameRateCounter 属性设置为 true,这个设置将在浏览器的状态栏里显示呈现的 Silverlight 内容的帧速率(fps,frames-per-second),这样,你就能为你的应用程序调优。
Silverlight 插件尽量少用透明背景
透明背景或许是很有用的,例如,当你嵌入的 Silverlight 插件包含一个非矩形的形状如汽车的照片时,你不想显示汽车周围的矩形内容。你可以设置透明的 Silverlight 插件背景只让汽车的图片显示出来。然而,使用透明的 Silverlight 插件背景对性能有重大影响,因此,应尽可能地避免使用这种功能。
使用 Silverlight 动画而不是自己创建每帧组成的动画
使用 Silverlight 插件内嵌的动画比你使用 JavaScript 创建自己的每帧动画要快的多。 随时间推移使用元素树的推荐做法是使用动画系统。这种方法是与平台和浏览器无关的,并且是最有效的。
避免对文字大小使用动画
对文字大小进行设置动画潜在地会使用大量系统资源。这是因为 Silverlight 在呈现文字时使用 hinting(字体微调) 平滑文字技术。如果如果对文字大小设置动画(通过 Transform 对象或者 FontSize 属性), Silverlight 对每帧都进行微调,这会导致资源的浪费,也可能会导致帧的丢失。 如果你的程序需要动态修改文字大小,最好使用向量图形代替文字。
避免使用 Windowless(无窗口)模式
只在必要时才设置 Windowless 属性为 true ,Windowless 模式是很费资源的,可能导致动画的破裂。
尽可能使用 Visibility(可视性) 而不使用 Opacity(不透明度)
如果你想简单地让对象可见或不可见而不是使用部分不透明度或者淡出淡入对象,请使用 Visibility 属性而不使用 Opacity 属性。Opacity 意味着较高的代价,这是因为,对象仍然是可点击的,并且需要呈现。将 Visibility 设置为 Collapsed 可避免这些问题。
Silverlight 使用多核呈现和媒体回放
Silverlight 利用多核的优点进行内容呈现和媒体回放。因此,你的 Silverlight 程序在多核系统上表现得会更好。
在全屏模式下,隐藏不用的对象
当程序进入到全屏模式时,隐藏所有在全屏模式下不需要呈现的对象,或者从元素树中断开他们。你可以将对象的 Visibility 属性设置为 Collapsed。
不要使用 MediaElement 对象的 Width 和 Height 属性
尽量避免明确设置 MediaElement 对象的 width 和 height 属性。相反,让媒体元素以它原本的大小显示,如果你需要这些元素的显示大小,最好使用媒体编码工具重新将媒体编码成期望的大小。
不要使用 Path 对象的 Width 和 Height 属性
不要设置 Path 对象的 Width 和 Height 属性。设置这些属性会导致额外的拉伸,影响性能。相反,明确设置 Path 对象的坐标控制它的形状和位置。
当 Downloader(下载器)完成时,分离对象并设置为 null
当你使用 Downloader 对象时,当 Completed 事件触发后,分离掉 Downloader 的所有事件处理器,然后将 Downloader 设置为 null。
将 CPU 密集的工作切分成更小的任务
当 JavaScript 运行时,插件停止呈现。通常,在事件处理器中做点少量的工作时,这不是什么问题。然而,如果你的程序需要在 JavaScript 线程上执行大量的CPU 密集的工作,我们建议你将这个工作划分为更小的任务。这将会保持期望的帧速率进行呈现。