Windows Phone的图形线程架构针对移动设备进行了优化,同传统系统的主要区别如下:
- 在原来用户界面(User Interface thread)线程基础上,引入了构图线程来分担用户界面线程的工作,以便改善性能。
- 在构图线程(composition thread)上会对动画做自动缓存处理后交由GPU处理。
在进行动画处理时,大量图形属性值每33毫秒进行一次计算、更新。为了避免这些计算影响其他代码的运行,在Windows Phone中引入了构图线程完成这类计算,其结果无需进一步栅格化,就可以直接传给GPU进行呈现。这就是所谓自动缓存。
使用构图线程和手机、仿真器上的GPU可以显著改善图形处理性能。应用程序设计中应该充分利用构图线程,而限制使用用户界面线程,并采用自动缓存技术发挥GPU的优势。
构图线程
构图线程处理的动画同一些属性值相关。例如DoubleAnimation类及其EasingFunction属性。使用构图属性的动画还有很多属性中的双精度变量,例如:RenderTransform属性中的双精度变量TranslateTransform.X。再例如Opacity属性本身就是双精度变量。
系统支持一组帧频计数器衡量构图线程的性能。
用户界面线程
在用户界面线程处理用户输入,用户代码,控件代码,布局,以及构图线程不处理的动画。这里的用户代码是指类似托管代码,游戏循环,每帧回调函数,以及网络阻塞处理代码。Windows Phone设备比桌面操作系统消耗更多CPU资源处理输入。所以当用户界面线程负荷过高,系统性能会受到影响。为了避免这种情况,应用程序设计时应该尽量利用构图线程。
用
GPU
展现缓存内容
通过使用缓存,应用程序可以像处理图像一样地处理视觉子树上的每一帧静态内容,这种处理有点像处理WriteableBitmap。系统使用GPU展现缓存中的内容。当缓存内容主要是更新频率较低的内容时,程序性能就得了到优化。
桌面和手机系统中的Silverlight都能用GPU展现缓存内容,加速图形化处理。手机上的Silverlight支持桌面上没有的功能:构图线程上的动画会自动缓存;GPU直接进行透视变换;GPU支持矩形剪纸; EnableGPUAccleration是内置的无需手工开启。
开发人员可以尽量利用构图线程的自动缓存和GPU加速机制优化应用程序。比如将双精度数值计算集中在自动缓存的属性中,例如 RenderTransform,透视转换的Projection,矩形的Clip,以及Opacity。
没有在构图线程上运行的属性也可以手工将CacheMode设成BitmapCahce启用缓存和GPU加速。当然这是以额外的缓存空间消耗为代价换取运行性能,在实际应用开发中应该在缓存空间和运行性能间进行折中。