Windows Phone 是资源有限的设备。我们必须考虑电池使用时间、CPU/GPU 的处理能力、连接性、带宽、存储容量、多任务模型以及应用程序可以在其中运行的内存量。Windows Phone 的设计很注重性能,而且对于创建具有更高性能的平台也非常谨慎。
从用户的角度来讲,性能归结于一点 - 即拥有具有响应性的应用程序。响应性应用程序能快速加载要显示的数据并随着用户交互的发生快速做出响应。这种情况下,存在很多需要考虑的事情;首先,应用程序必须快速启动。用户不喜欢等待很长时间才能使用应用程序。Windows Phone OS 实际上会自动终止一个要花 10 多秒才能加载的应用程序。应用程序完全加载后,用户在与应用程序交互时就会关注运行时性能;当尝试优化 Windows Phone 应用程序的性能时,需要找到适合特定情况的正确的技术组合。在多个不同的硬件类型上全面测试应用程序。
Windows Phone 制造商必须生产 RAM 至少为 256 MB 的手机以便进程在其中运行。许多手机附带的 RAM 都超过 256 MB,但是这是个下限。因此我们不能假定应用程序在 RAM 大于 256 MB 的手机上运行。RAM 数量在 Windows Phone 上要比在桌面版本 Microsoft Windows 上受到较多的约束。应用程序可以使用的内存量比手机上的 RAM 数量要少得多。windows phone技术认证要求主题包含与内存占用相关的认证要求,应用程序必须符合此要求,否则应用程序认证过程会失败。
应用程序的加载性能受几个因素的影响。
1.应用程序集大小;
应用程序程序集越大,加载花费的时间就越长。若要帮助将应用程序程序集的大小降到最小,可以删除图像、媒体和 XML 文件。这些内容仍然是 XAP 部署的一部分,但是应用程序程序集中不再保留它们。这些内容应该保留为程序集的外部内容。(对每个文件将生产操作属性设置为内容。)对于包含应用程序中很少导航到的图像的页面,这样做很有意义。在需要这些页面上的图像之前,系统一直不会加载它们;本地化的字符串应该置于单独的程序集中。对于用户可以导航到但并非一直需要的应用程序中包含许多页面,则可以将其分隔到其他程序集中。然后只需在新程序集中引用页面并且仅在需要时按需对其进行加载即可。
2.页面初始化或者加载时执行的代码量;
减慢应用程序加载速度的另一个因素是加载时执行的代码数量;应该将放置到 Constructors 和 Loaded 事件的代码降到最少,可以将该代码放入绘制 UI 后发生的应用程序事件中,或者在后台线程上运行该代码;实现这个目标的一种方式是,处理 LayoutUpdated 事件并在此处理程序中启动长时间运行的进程;
在主 UI 线程上运行的任何代码都会阻止与用户的 UI 交互,直到该过程完成为止;阻止 UI 线程的服务或Api主要有:定位服务、推送通知、网络信息和收音机。
ItemsControl 和 ListBox 的用法或许是应用程序可能遇到性能问题的最常见位置。若要正确使用这些控件,需要考虑要在 ListBox 控件中显示多少项,对于 ListBox 控件中的各个项来说,布局的复杂程度如何;具有包含图像及其他控件的复杂数据模板的列表框可能会显示地比较缓慢;
当滚动listbox时,这可能会导致屏幕急动和冻结,具有复杂嵌套堆栈面板和嵌套网格的数据模板可能会产生性能问题,最好将其简化到具有正确列和行的单个网格,使用 ListBox 控件存在多种方法,因此采取的设计方法取决于具体使用情况;对于复杂度、高重绘的listbox,最好启用ui虚拟化;
Panorama 控件一次呈现所有的 UI,包括所有面板的所有 Silverlight 绑定;Panorama 面板上无法查看的动画仍然可以进行动画处理,该操作可能会导致性能损耗,如果正确使用,对某些交互来说,Panorama 仍然是一个好的选择并且仍然可以达到好的性能。
优化 Panorama 性能,可以推迟加载与所在的面板不相邻的面板,然后,在用户平移时,加载下一个相邻的面板,尽量保持控件和布局简单;如果背景图像分布在 Panorama 面板上,则 Panorama 控件还可能占用更多内存;
Pivot 控件的性能通常优于 Panorama 控件的性能;启动后,Pivot 控件会创建它启动时所在的 Pivot 页面和相邻的 Pivot 页面,若要使 Pivot 控件更好地执行,可以将所有相邻的 Pivot 页面内部的所有内容的 Visibility 设置为 Collapsed,这会阻止它绑定或呈现任何数据。然后,当 Pivot 页面位于视图中时,将所有内容设置为可见,这时 UI 就会呈现该内容。
如果您希望显示进度栏,请使用不确定的自定义进度栏。
使用操作事件尽可能多地处理手势。避免使用鼠标事件。
最小化或消除垃圾回收。这在 XNA® Game Studio 游戏中效果更明显。
如果希望动画在数据加载到应用程序前发生,则可以延迟数据上下文绑定或项目源的设置,直到动画结束为止。
导航回页面时,您不必再次检索数据并重新绑定该数据,除非发生了一些事情导致您需要刷新数据。
ListBox 中 opacity = 0 的 TextBlock 会导致性能问题。
避免在 ListBox 的数据模板内使用用户或自定义控件。
在 ListBox 控件中避免 Element 名称绑定。
每帧回调动画都完全受 UI 线程支配,随着 UI 线程中发生的操作越来越多,帧速率会有所下降并且动画也会受到影响。通过将 CacheMode 属性设置为BitmapCache,至少可以避免重绘。
应用程序中包括的任何媒体文件(如声音效果)都应该将其“生成操作”设置为“内容”而不是“资源”。对 Windows Phone 上的媒体处理进行优化以使用文件和网络流,而不是使用内存中的流。
在应用程序中将资源密集型控件分离到单独的页面,以便不会一次使用所有的控件。例如,不要将 Bing 地图和视频放置在相同的页面上。