[05.15] 关于 Windows Phone 7 Silverligth 性能改进
这些天写新浪微博学习了很多东西,发现很多东西不记下来还是会忘。所以开博来记录一下。
今天暂时考虑记录Performance这一块,因为一个月的开发下来,发现ListBox的确卡的要命。
那么没办法我得把ListBox 给修理一番,但是途中发现软件很多可以改进的地方。
例如一些Visible的控制,Image的处理,WebClient改为HttpWebRequest等,ProgressBar更改。
主要都是一个原则,尽量少的占用UI线程的资源,尽可能后台线程处理,到处理完毕再Invoke。
但是以前就总觉得什么方便用什么,看来还是不行啊,移动平台资源有限,浪费可耻啊。
主要是影响用户体验什么的,很不爽。
1.程序启动
a.启动过程可以用SplashImage,这个没问题,有一个有意思的。
b.System.Threading.Thread.Sleep(Int32) 这个可以让进程停留在等待画面,也就是让第一屏停留更久。
c.最小化程序的assembly,语言文件编译为附加的assembly,资源选用content模式。
d.图片尽量选用jpg而不是png,除非需要使用到透明处理。
e.MS团队建议编译为很多小的链接库而不是都放在主程序内,甚至可以每个页面配一个Project???
f.然后是注意页面载入的过程,最好是在XAML解析完毕之后再处理Heavy long-running process,原理是利用页面 LayoutUpdated 事件的触发。
代码如下:
private bool _onNavigatedToCalled = false; public Page() { InitializeComponent(); LayoutUpdated += new EventHandler(Page_LayoutUpdated); } protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { _onNavigatedToCalled = true; } private void Page_LayoutUpdated(object sender, EventArgs e) { if (_onNavigatedToCalled == true) { _onNavigatedToCalled = false; Dispatcher.BeginInvoke(() => { // Do your stuff here, in the “future” } } ); } }
g.对隔离存储空间内文件的读写最好注意掌控时间,如果需要长时间读取的考虑利用Dispatcher。
h.尽量减少UI线程被Block,能block UI 线程的事件有 Push Notification,NetWork Information ,Location Services,Radio。
2.线程的理解
WP7里面有几种线程
a.UI 线程。感觉有点类似前台。
b.Composition 线程。小秘书,经常用来递送数据给GPU。
c.Animation 线程。动画,处理story-board比较多,传递给GPU。
d.BackgroundWorker。异步处理背景线程,DoWork,还有Complete实现Invoke。
3.图像处理
a.我纠结了很久的WP7调试时边上那一条不知什么东西的,可以通过下面代码禁用掉。
Application.Current.Host.Settings.EnableFrameRateCounter = false;
见图,其中第一项第二项建议值为 30-60,Fill Rate在下一条详解:
b.Fill Rate。WP7有一个Fill Rate限制,控制在2.5以内为佳,上3会产生警告。这个值的含义是显示出绘制了多少个屏幕长度的图像。
4.重头戏来了ListBox。
网上可以下载到很多关于WPSL的ListBox改进版,有一个RadControl 里面包含很多List 有Jump List 和 DataBound List,但是有个很有趣的地方就是他们做的很多控件跟Silverlight.Toolkit 里面很多好像有相似,毕竟SLTK是开源项目,这方面就不做过多深究了。网上这个 Control 包卖1xx 美元,其他途径就不多透露了哈。
那么竟然说了很多控件 就不止这个了。下面的链接都有详细描述啦。
5.参考链接:
Deferredload Listbox:
Performance silverlight sample:
List Box Performance:
Lazy ListBox: