Windows Phone性能优化建议

原文:Windows Phone性能优化建议

  • 使用background thread解码图片

     在Windows Phone中支持的图片格式有jpg和png,微软建议使用png格式的图片,因为png格式的图片在解码速度上要比jpg快。那么我们怎么来控制用后台线程来解码图片呢?看下面的代码。

<Image Height="100" Width="100" Margin="12,0,9,0">
  <Image.Source>
    <BitmapImage UriSource="{Binding ImgURL}" CreateOptions="BackgroundCreation"/>
  </Image.Source>
</Image>
var bi = new BitmapImage();
bi.CreateOptions = BitmapCreateOptions.BackgroundCreation;

     这两段代码都设置了BitmapImage的CreateOptions属性,这样做避免了在UI线程来对图片解码,在使用过程中BackgroundCreation确实有效地提高了页面的响应效率,尤其是在图片密集型的页面。需要注意的是,图片位置可能出现短暂的空白,不过这段时间我们可以通过一个图片占位符的方法来处理。CreateOptions属性包括有四种:

  1. None                          不对CreateOptions做任何设置。
  2. DelayCreation             是BitmapImage的默认属性,在必要时创建图片。
  3. IgnoreImageCache      图片将不启用缓存,适合于频繁需要更新的图片。
  4. BackgroundCreation    图片的解码在后台线程完成。
  • 减少不必要的PropertyChanged事件的触发

     在MVVM模式的开发中,通过设置INotifyPropertyChanged接口使View作为一个观察者,可以使我们方便的通过DataBinding更新UI内容,这里我们要说的其实PropertyChanged事件是一个冗长的方法。如果你使用的是VS2012或更高的版本使用工具栏的Code Map按钮可以看到系统监听的add_PropertyChanged事件,而且它在UI线程上执行。为了减少不必要的PropertyChanged事件的触发,我们可以采用下面这种方法来对value的值提前做出判断。

public string Text
{
    get { return _text;}
    set
        {
           if( _text == value) return;
           _text = value;
           RaisePropertyChanged("Text");
         }
}
  • 减少Databinding中Converter的使用

     在Databinding中我们可以创建一个继承自IValueConverter的类实现Convert方法来对绑定的值做进一步处理,这个处理会直接影响到绑定的速度,而且这个转换是在UI线程执行的,如果我们把一个很重的方法放在了这个Converter里,那绑定的速度就可想而知了。总之,对后台数据的处理还是在后台线程中准备好之后在通知UI更新,尽量避免因为Converter造成的UI阻塞。

  • 开启集合控件的虚拟化

     在之前的一篇博客中我们介绍了在Windows Phone中集合控件的使用。VirtualizingStackPanel是一个重要的概念,在ListBox中默认的Itmes的容器就是VirtualizingStackPanel,这个容器是虚拟化的,不同于StackPanel。它只创建了大约屏幕可见的数量,而非将ListBox中的Items一次全部创建,随着上下滚动再次创建剩下为显示在屏幕上的内容。这样就大大节省了页面首次渲染的时间。

     VirtualizingStackPanel还有一个比较重要的属性,就是VirtualizationMode。这个属性有两个值。

  1. Standard 每次都会为容器的Item创建新的VirtualizingStackPanel,并回收之前创建的容器。
  2. Recycling 重用之前创建的VirtualizingStackPanel。

     显然我们开启VirtualizingStackPanel的Recycling模式来重用容器,避免新的容器的创建。下面是一个ListBox的示例代码。

<ListBox ItemsSource="{StaticResource data}"
         VirtualizingStackPanel.IsVirtualizing="True"
         VirtualizingStackPanel.VirtualizationMode="Recycling" />
  • 动态加载PivotItem

     在Windows Phone开发中轴心控件Pivot绝对是一个布局很好的选择。但是如果我们的页面的PivotItem比较多,会直接影响到我们页面的渲染时间,尤其是在首页的时候,等待的时间可能会更加长。这时候我们可以考虑动态的加载PivotItem的方法来减轻首次加载页面的时间,我们只需要在页面定义空的PivotItem,再在OnLoadingPivotItem的事件中动态的创建UserControl并加入到相应的PivotItem的Content中即可。

<controls:Pivot x:Name="pivot" OnLoadingPivotItem="OnLoading">
          <controls:PivotItem x:Name="firstItem"/>
</controls:Pivot>                
public void OnLoading(PivotItem item)
{
    if(item.Content == null)
      {
           var userControl = new CustemControl();
           item.Content = userControl;
      }
}
  • 为ObservableCollection添加AddRange方法

     ObservableCollection绝对是数据绑定过程中重要的集合,使用这个集合可以通过Add方法方便的更新集合。但当数据量大的情况下我们是否可以考虑自定义一个AddRange方法,来替换掉每次Add的时候触发的NotifyCollectionChangedAction.Add类型的事件。而改用NotifyCollectionChangedAction.Reset使整个页面只刷新一次。那么就来看看这个扩展类的写法。

public class ObservableCollectionEx<T> : ObservableCollection<T>
{
    public void AddRange(IEnumerable<T> list)
    {
        foreach (T item in list)
        {
            Items.Add(item);
        }
        OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
        OnPropertyChanged(“Count”);
    }
}
  • 使用Async、await、Task<TResult>异步编程

 

 

时间: 2024-10-01 13:23:50

Windows Phone性能优化建议的相关文章

Windows 7性能提升建议

第一个建议非常简单.你只需确保你的硬件满足Windows 7最基本的要求.如果你正在使用Windows Vista系统,那么你便可以放心使用Windows 7.Windows 7的具体硬件要求如下: * 16 GB硬盘空间(32位),20 GB硬盘空间(64位): * 1GHz或更高主频的32位或64位处理器: * 显卡支持DirectX 9,支持WDDM 1.0 (或更高版本),128MB显存: * 1GB内存(32位),2GB内存(64位) 如果要运行Windows7 XP模式,系统内存则需

oracle 性能优化建议小结_oracle

原则一:注意WHERE子句中的连接顺序: ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾. 尤其是"主键ID=?"这样的条件. 原则二: SELECT子句中避免使用 ' * ': ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间 . 简单地讲,语句执行的时间越短越好(尤其对于系统的终端用

Android 代码性能优化建议

这篇文章主要介绍一些小细节的优化技巧,当这些小技巧综合使用起来的时候,对于整个App的性能提升还是有作用的,只是不能较大幅度的提升性能而已.选择合适的算法与数据结构才应该是你首要考虑的因素,在这篇文章中不会涉及这方面.你应该使用这篇文章中的小技巧作为平时写代码的习惯,这样能够提升代码的效率. 通常来说,高效的代码需要满足下面两个规则: 不要做冗余的工作 如果能避免,尽量不要分配内存 在优化App时最难解决的问题之一就是让App能在各种类型的设备上运行.不同版本的虚拟机在不同的处理器上会有不同的运

.NET程序的性能要领和优化建议

前几天在老赵的博客上看到,Bill Chiles (Roslyn 编译器的Program Manager)写了一篇文章叫做<Essential Performance Facts and .NET Framework Tips>.这篇文章是一个14页的pdf,当时我是在地铁上在Lumia手机上看的,觉得很是不错,这里也建议大家直接下载阅读原文,我这里试着翻译一下,以加深自己印象,后面也有一些思考,以下是原文内容: ----------------------------------------

.NET开发中性能的基本要领及优化建议

老赵的.NET程序性能的基本要领 说起Roslyn大家肯定都已经有所耳闻了,这是下一代C#和VB.NET的编译器实现.Roslyn使用纯托管代码开发,但性能超过之前使用C++编写的原生实现.Bill Chiles是Roslyn的PM(程序经理,Program Manager),他最近写了一篇文章叫做<Essential Performance Facts and .NET Framework Tips>,其中总结了几条经验,目前是个CodePlex上的PDF文件,以后可能会发布在MSDN上.

JQuery性能优化的几点建议_jquery

针对jquery性能优化这个主题,想必大家都有所了解.下面是我搜集点一点资料关于jquery性能优化,大家可以参考参考. 一.选择器性能优化建议  1. 总是从#id选择器来继承:这是jQuery选择器的一条黄金法则.jQuery选择一个元素最快的方法就是用ID来选择了:  2. 在class前面使用tag:jQuery中第二快的选择器就是tag选择器(如$('head')),因为它和直接来自于原生的Javascript方法getElementByTagName().所以最好总是用tag来修饰c

jQuery性能优化28条建议你值得借鉴_jquery

jQuery性能优化28条建议 一直在寻找有关jQuery性能优化方面的小窍门,能让我那臃肿的动态网页应用变得轻便些.找了很多文章后,我决定将最好最常用的一些优化性能的建议列出来.我也做了一个jQuery性能优化的简明样式表,你可以打印出来或者设为桌面背景. 一.选择器性能优化建议 1. 总是从#id选择器来继承 这是jQuery选择器的一条黄金法则.jQuery选择一个元素最快的方法就是用ID来选择了. 复制代码 代码如下: $('#content').hide(); 或者从ID选择器继承来选

JavaScript提高网站性能优化的建议(二)_javascript技巧

在javascript关于提高网站性能的几点建议(一)中,从HTTP请求到页面渲染几个方面对提高网站性能提出了几点建议,本文是学习Steve Sounders的另外一本书<高性能网站建设进阶指南>之后,从JavaScript性能的角度进行总结概括,诸君共勉. JavaScript性能是实现高性能Web应用程序的关键 --Steve Sounders 1 利用js作用域链 作用域链(scope chain) 当执行一段JavaScript代码(全局代码或函数)时,JavaScript引擎会创建为

对于jQuery性能的一些优化建议_jquery

不要每次都在循环中访问数组的 length 属性,应在循环开始之前就将其缓存: var myLength = myArray.length; for (var i = 0; i < myLength; i++) { // do stuff } 在循环外执行 append 操作 直接操作 DOM 是非常耗费性能的,尤其不要在循环中直接操作 DOM: // 这样性能很差 $.each(myArray, function(i, item) { var newListItem = '<li>'