代码改变世界

WP7 App性能优化(6):理解线程

2010-12-20 23:04  MagicKing110  阅读(2968)  评论(2编辑  收藏  举报

Windows Phone 7中的Silverlight图形线程架构特别针对设备做了优化。Windows Phone 中的Silverlight 支持用一个构图线程作为UI线程的附加。要知道如何对Windows Phone 7做性能优化,理解WP7中的两个主线程和后台线程的使用是非常重要的。

 

UI线程

UI线程是WP7中的Silverlight应用程序的主线程,其功能和Silverlight浏览器插件的主线程很类似。以下列出了UI线程负责处理的任务:

  • 处理用户输入
  • 解析XAML并创建对象
  • 绘制所有元素首次呈现的视图
  • 处理每一帧的回调,执行其他用户代码

因为UI线程要负责处理用户输入、绘制新视图、回调用户代码,所以要尽可能保证该线程空闲。维持一个轻型的UI线程是创建高响应性应用的关键。前面博文中的避免阻塞UI线程介绍了一些在应用启动时避免阻塞UI线程的方法。

 

构图线程

构图线程会分担一些通常由UI线程处理的工作,因此可以提高WP7上的Silverlight应用程序的性能。构图线程合成了图形纹理并将其递交给GPU进行绘制。在WP7上的SIlverlight中,storyboard驱动的动画运行在构图线程中,并且会被设备的GPU在一个称为自动缓存的进程中自动缓存和处理。

构图线程会处理一些简单的与RenderTransformProjection属性关联的动画。以下列表显示了构图线程经常书里的动画。

注意:为了充分利用构图线程,缩放(scale)转换必须小于原始大小的50%。

另外,P:System.Windows.UIElement.OpacityP:System.Windows.UIElement.Clip属性也是由构图线程处理的。然而,如果使用了Opacity mask或非矩形剪辑的话,这些操作将被传递给UI线程处理。

 

动画与线程

正如上文所言,storyboard驱动的动画由构图线程处理。这是很完美的,因为构图线程会将这些递交给GPU处理。另外,如果CPU超负荷时,构图线程比UI线程运行的更加频繁。然而有些情况,storyboard动画无法满足应用程序的需要。这时,应当选择在代码中驱动动画。这些动画会被逐帧处理。很多情况下,这是合理的,但是你应该知道在逐帧回调中运行动画的影响。

逐帧回调严格的在UI线程中处理。动画将会以UI线程能够处理的速度进行更新,这就依赖于应用程序正在执行什么操作,动画的呈现可能不会像运行在构图线程中一样平滑。当在代码中更新动画时,元素不会像通过storyboard更新时一样自动缓存。如果在这些元素中手动添加了位图缓存,转换和混合操作将会被递交给GPU处理,但是动画仍然是在逐帧回调中更新,由UI线程处理。这种情况下,动画更新会和UI线程的帧频一致。

 

后台线程和异步编程

为了避免复杂的处理阻塞UI线程,可以将这些处理卸载到辅助线程中,也就是在后台线程中异步处理。例如,所有的Web Service的 API都被设计为异步处理以免他们阻塞UI线程。如果使用后台线程,必须提供一种机制将后台线程中的数据转移到UI线程中。这既可以通过共享变量和事件进行数据传递,也可以使用M:System.Windows.Threading.Dispatcher.BeginInvoke(System.Action)方法将数据发送给UI线程。另外iayekeyi使用T:System.ComponentModel.BackgroundWorker类和其事件进行基于异步机制的处理。更多信息请参考How to: Use a Background Worker

转到:WP7 App性能优化(0):索引页