Chinaunix首页 | 论坛 | 博客
  • 博客访问: 539021
  • 博文数量: 150
  • 博客积分: 5000
  • 博客等级: 大校
  • 技术积分: 1705
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-11 23:29
文章分类

全部博文(150)

文章存档

2011年(9)

2010年(25)

2009年(94)

2008年(22)

我的朋友

分类: LINUX

2009-06-16 17:07:54

前边已经介绍了如何通过Layout优化系统资源,减少不必要的资源占用。基于如何在合理利用资源的前提下,更进一步的提升视觉表现力。这里所提到的视觉表现力并不是指直观所看到的视觉效果,而是性能的提升。

这里将包含两个主要内容:

  • Drawing(绘制的刷新率)
  • Startup Time (启动Activities的时间)

     以上两个性能的优化都将依赖于 Window backGround drawable功能设置。

通过Window backGround标识会对部分人产生一定的误解,其实每次通过setContentView()来显示预先配置的界面时,Android仅仅是将你所 创建的Views添加到Activiy的Window中。而且这个Window并不仅仅包含你所创建的Views,还包括Android为 Activity预置的元素。通过Emulator运行你的程序,然后通过Hierarchy Viewer查看当前程序UI架构Root节点 DecorView,这个是Android额外添加的最顶层的节点。

ui_speedup_decorview

实际上Window background drawable是由DecorView决定的。可以在Activity中调用方法来设置DecorView的background drawable。这里要特别注意这个方法是针对当前版本的Android平台,以后可能会因为版本的更新或不同的硬件设备而改变。(目前我们仅针对G1,如果在其它环境下测试需要小心验证)

如果目前正在使用android默认的标准Themes,那么在调用方法之后,这个background drawable将会影响你的activities。通过一个例子来直观的比较性能提升的效果:

ui_speedup_decorview_002

通过上边这个截图可以看到保持activity的redraw模式下,当前的FPS为39帧 /每秒,大概相当于25毫秒/每帧。由于这个例子中将ImageView设为全屏显示,并且完全覆盖了activity的背景,所以background drawable占用了不必要的计算资源。下边创建一个新的Theme并且应用在Activity中,创建res/values/theme.xml, XML的内容:

<resources>
   
<style name="Theme.NoBackground" parent="android:Theme">
       
<item name="android:windowBackground">@null</item>
   
style>
resources>

同时也需要修改AndroidMainfest.xml文件,将上边所创建的Theme应用到Activity中,格式为:



        
                  android:label="@string/app_name"

                  android:theme="@style/Theme.NoBackground">

            

                

                

            


        


    

(也可以将Theme应用于标签中)完成上边的修改后,再来看看当前的FPS发生了什么变化:

ui_speedup_decorview_003

FPS可以增大到60+,性能得到如此大的提升,是不是比较难以置信呢?由此可以明白当应用MapView或者WebView全屏显示的应用程序时,可以借用这个简单设置的方法,来提升整体的性能。

通过上边的例子可以直观的了解window background drawable的优化方法,并且根据比较可以很明显的看到设置前后的性能对比,希望这个简单的技巧可以给你的应用带来帮助。

另外基于这个技巧的应用,还可以延展出另外一个优化功能。对于某些需要全屏显示的应用程序,可以通过Theme定义Window’s background的图片,从而提高Activity的启动速度。毕竟无需建立一个ImageView作为自定义的背景,而重复叠加在Activity window background。

实现方法:

创建 res/drawable/background_res.xml

<bitmap xmlns:android=""
    android:src="@drawable/shelf_panel"
   
android:tileMode="repeat" />

创建res/values/theme.xml

<resources>
   
<style name="Theme.Shelves" parent="android:Theme">
       
<item name="android:windowBackground">@drawable/background_res</item>
        trueitem>
   
style>
resources>

往往一些看似简单的方法,却能起到非常大的作用。还希望大家在实践中能不断的挖掘出非常实用的技巧,然后与你周围的人共享你的发现,同时在大家共同的见证下可以完善你的想法!

阅读(1457) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~