欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > 内容正文

Windows Phone 性能优化(一)

来源: 开发者 投稿于  被查看 12155 次 评论:33

Windows Phone 性能优化(一)


 

在实际的项目开发过程中,应用的性能优化是一个永恒的话题,也是开发者群里最常讨论的话题之一,我在之

前的公司做 wp项目时,也遇到过性能的瓶颈。当页面中加载的内容越来越多时,内存涨幅非常明显(特别是

一些壁纸类的应用,当用户向下滑动列表加载更多),当内存超过 120MB 有些机型的发热明显,如果内存继

续上涨,发热事小,内存泄露后,系统会直接关闭应用。

 

在 wp 系统中自带的 ListBox 等控件也提供内存虚拟化,但是如果用得不好,可能会破坏虚拟化。

微软 MSDN :Windows Phone 的应用性能注意事项

 

MSDN 部分摘抄:

SilverlightUI

UIXMLOne  TimeOne WayTwo  Way

 

VSP

user  interface (UI) StackPanel StackPanel VirtualizingStackPanel

VirtualizingStackPanel ListBox IsVirtualizing true IsVirtualizing false VirtualizingStackPanel StackPanel

VSPVSPVSPListBoxVSPStandardRecycling

ListBoxVSP

DataTemplate Grid

Converter

ListBoxListBox

 

加入动画验证 ListBox 项的动态创建和删除

为了验证 ListBox 在列表部分内容滑入、滑出屏幕可视区域时,内容是动态创建和删除的,我在 ListBox 的

ItemTemplate 模版中给每个项加入动画,并且通过  <EventTrigger RoutedEvent="StackPanel.Loaded">

进行触发,当滑动列表时,运行效果:

1)首先自定义一个 News 类,包含两个字段,一个 Title ,一个 Picture:

(value !== (value !== NotifyPropertyChanged( (PropertyChanged != , View Code


2)在工程的根目录下创建一个 Image 文件夹,里面放 10张示例新闻配图。

3)MainPage 中只需要关注两个控件,一个是 页面顶部显示内存的:

  

 

第二个是显示新闻列表的:
它的默认 ItemsPanelTemplate 是 VirtulizingStackPanel。在有些交换中,需要去掉 ListBox

的虚拟化功能,就可以把这个 换成


     
                               
      

 

在 ListBox 的 ItemTemplate 中放一个触发器,当 StackPanel 触发 Loaded 事件的时候,播放预定义动画(在 Blend 中设计的动画)。

从而可以判断每次当 ListBox 的 Item 创建完成后,就会触发一次这个动画。StackPanel 中放一个 TextBlock 和一个 Image,用来

显示 News 的 Title 和 Picture 字段。

 
      
            
                
                       
                             
                                        
                                         
           
      

 

ListBox 的完整 xaml:

View Code

 


4)创建示例新闻,通过 Random 类控制每条新闻的 标题长度和 配图是 随机的:

         示例数据源=  LoadNews( ( i = ; i < Length; i++=                              你最好能够熟记百度百科上有关他生平的介绍,如果记不全也没关系,知道《黑客帝国》
主创人员都被要求看《失控》这件事,就足以应付一干人等了。
.Substring(, rd.Next(,= + rd.Next(, ) +

 

在 MainPage 中自定义一个 DispathcerTimer 对象,每隔两秒,把当前应用所占的内存打印到顶部:

        内存使用情况

        = = TimeSpan.FromSeconds(+=   total =   current =   peak =     dispacherTimer_Tick(
            totlaBytes = (
            currentBytes = (
            peakBytes = (            txtMemory.Text = .Format(, 
currentBytes / ( * ), peakBytes / ( * ), totlaBytes / ( *

 

5)初始化 MainPage 中的 列表等操作:

        ObservableCollection<News> NewsList =  ObservableCollection<News>();
        .Loaded += MainPage_Loaded(
            LoadNews(
            .DataContext =

 

 

运行上面的代码,看到顶部的内存占用很少。当把 VirtualizingStackPanel 换成 StackPanel 时:


       
                                    
        
 


变成:

 
      
                             
      
 

 

运行工程,靠,内存直接上 200MB,是之前的约 20倍,如果在 512MB 的设备上,会直接被系统杀掉。

并且当滑动时,也不会触发 Loaded 的动画:

 

 

当然,如果 ListBox 使用不当也会破坏它的虚拟化,比如有的项目中,把 ListBox 放在 一个 ScrollViewer

中,虚拟化就不起作用了,确实有些这种情况,并且开发者并没有注意到这个问题所在。比如有的朋友在

ScrollViewer 里,上面放一个 幻灯片,下面放一个 ListBox(或者 ItemsControl 控件):

 

 

因为 ListBox 的虚拟化功能不被破坏是需要一定条件的,在后面的文章会介绍如何如何模拟 ListBox 实现虚拟化功能,

其实原理很简单,就是在列表中的项,不在屏幕的可视区域内时,动态的隐藏或者删除,当滑动回来时,再重新

显示或创建。

 

本文 demo 下载

相关频道:

用户评论