Android----窗口背景&UI性能

翻译:窗口背景和UI性能
(原文见:http://androidappdocs.appspot.com/resources/articles/window-bg-speed.html)
一些android应用需要通过UI工具来尽量提高任何一点所能提高的性能,的确有很多方式可以做到这一点。在这篇文章里面,你将可以发现如何加速你activity的绘制和启动。综合这些技术取决于一点,那就是窗口的背景绘制。
窗口背景这个术语可能有点让人误解,但是,当你通过在你的activity上调用setContentView()来启动你的用户界面的时候,android将你的views添加到了activity的窗口上。这个窗口尽管并没有包含你的view,但是却为你构建了一下其它的东西。其中最重要的,就是在当前T-Mobile G1使用的-DecorView。下面view组织结构中加亮的部分:

DecorView才是真正掌控窗口绘制的view。从你的activity调用getWindow().setBackgroundDrawable()改变窗口的背景是通过改变的DevorView的背景绘制。就像前面说的,这种架构在当前的android上实现是很特殊的,并且在将来的版本中可能会改变或者在其它设备中被改变。
如果你使用的是标准的android主题,在你的activity上绘制的将是一个默认的背景。这种标准的注意当前在G1上使用的例子是ColorDrawable。在多数应用里面,这种背景的绘制工作正常并且你可以不去理会它们。但是,它还是会影响你的应用程序的绘制的性能。让我们看一个经常要绘制全屏的不透明的图片:

你可以从这个截屏中看到窗口的背景是看不到的,被一个imageview完全给覆盖了。这个应用程序被启动后绘制最快的速度可以达到44帧每秒,或者是22毫秒每帧。(注意:文章前面使用的帧每秒的数据来自于我将手指放在G1上得到的,目的是减少绘制的速度否则会达到60帧每秒。)一种简单的让应用程序绘制加速的方法就是去掉背景的绘制。因为用户界面是不透明的,绘制背景是一种极大的浪费。去掉背景极大的改变了性能。


在这个应用程序的新版本中,绘制的速度达到了51帧每秒,或者19毫秒每帧。这3毫秒每帧的不同可以简单理解为在G1上的内存总线:时间被花在总线的移动相同屏幕的象素上。当默认背景使用更大开销的绘制是这之间的区别可能更明显。

去掉窗口的背景可以简单的使用定制theme而实现。首先,创建res/values/theme.xml包含如下的内容:

你然后需要将主题添加到你的的activity里面,通过增加属性:android:theme="@style/Theme.NoBackground" 到你的 <activity /> or <application /> 标签。这个技巧来对任何使用MapView、 WebView或者是其它全屏不透明的应用程序都非常方便。
不透明的views和android:这种优化在当前来说是必须的,因为android的UI工具包并不是那么智能足以阻止隐藏在不透明的子view后面的那些view的绘制。这种优化没有实现的主要的原因很简单,因为在android的应用中有很多的不透明的view。但是这就是我想尽早完全去实现的事情,并且我想大家道歉自己没能早点做完这件事情。
使用一个主题来改变窗口的背景也是一中改进你activity启动性能的很好的方式。这种特殊的技巧只能应用在activity使用了自定义背景的q情况。就像texture或者logo。Shelves就是一个很好的例子。

如果这个应用只简单的在xml文件里面或者onCreate()设置wooden的背景,用户将会看到应用在启动的默认主题也就是黑色的背景。Wooden texture只会在content viewinflat和第一个layout/drawing通过之后再回出现。这将会产生一个中不和谐的影响给用户以为应用程序花了时间去load的(的确有这种例子)。相反,应用程序定义了主题,应用程序将会在系统的引导下立即启动。用户再也看不到默认的主题而是看到应用立即启动,并且运行良好。为了减少内存和硬盘的使用,这个背景是一块纹理定义在res/drawable/background_shelf.xml:


Drawable被主题简单的引用:

同样的一个技巧被使用在G1上的一个Google Maps application. When the application is launched, the user immediately sees the loading tiles of MapView. This is only a trick, the theme is simply using a tiled background that looks exactly like the loading tiles of MapView.
通常最好的技巧也是最简单的, 所以当你下一次创建一个带有不透明的UI或者自定制的背景的activity,记住改变窗口的背景。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值