济源社区

 找回密码
 5秒注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 700|回复: 0

[译]关于Android图形系统的一些事实真相

[复制链接]
发表于 2011-12-9 09:22:56 | 显示全部楼层 |阅读模式
  此刻网上满天飞的各类关于Android图像衬着的水文其实让我不爽,下面给巨匠一些关于Android硬件衬着的事实秘闻,硬件加速并非巨匠想的那么完美,而我们也一向在改良!

  1. Android 一向在使用硬件加速。现实橄潢夜1.0版本之后,所有的窗口元素的合成与显示都是经由过程硬件完成的。

  2.这意味着良多你所看见的动画都是被加速过的:按钮的显示、通知栏下拉的暗影、分歧Activity之间的切换动画、弹出窗口以及提醒框的显示和潜匿等等等等。

  3.Android以前使用软件体例(与硬件加速相对应)来节制各个窗口元素的衬着,例如下图的UI,其中搜罗四个窗口组件:状况条、壁纸、桌面上的的启动器、以及菜单。如不美观其一一个元素更改了自身的内容,例如高亮一个菜单条目,对于3.0之前的版本,系统使用软件体例来绘制新的内容,然而并非所有的元素都需要被年夜头绘制,同时各个窗口元素的拼接也是经由过程硬件体例完成的。近似的,任何窗口的移动:例如菜单的上下行为是完全经由过程硬件体例衬着的。
Img328312318.png

  4. 此刻我们来关注窗口元素的内部衬着,现实上为了达到每秒60帧的FPS,你并不必然需要硬件加速。帧速取决于要显示的像素的数目以及CPU的速度。好比说,二儿子完全可以以60FPS的速度在它800*480分辩率的屏幕上完成任何通俗的原生UI动画,例如列表的滚动等,完全没有问题。而最初的Droid系列却很难达到这样的速度。

  5.在Android3.0中可以实现窗口的”完全”的硬件加速绘制。而在Android 4.0中也没有惹人更多的功能。 年夜3.0起头,如不美观在你的应用中设置了一个标识表记标帜许可硬件加速,那么此时所有的窗口的绘制城市交给GPU来完成。在Android 4.0中最首要的改变就是:在面向Android4.0或更高版本的应用中,硬件加速是被默认开启的,再也不需要在设置装备摆设文件中设置 android:handwareAccelerated=”true”.(而我们不许可之前的应用默认打开硬件加速,是因为光靠硬件加速,无法很好的完成某些非凡的绘制操作;同时在应用需要其一一部门UI更新的时辰,会影响其的一些默示。对于今朝现有的良多应用,强制开启硬件加速,会较着的间断应用的运行)

  6.硬件加速并不如巨匠所认为的那样完美。例如在基于PVR驱动的设备上(好比二儿子跟三儿子),光是在历程中开启OpenGL就得占用8M的RAM。对比一般历程的2M的开销其实是巨年夜。RAM是有限的,一年夜部门被拿去绘制,那么其他正在运行的历程就会因为贫窭内存而出问题,好比降低应用间切换的速度。

  7.因为OpenGL的额外开销,我们最好不要过多的使用其进行绘制。好比我们此刻在做的一些工作,就是为了让Android 4.0能在不使用硬件加速的情形下贱利的在二儿子上使用:这样我们就不需要在系统历程中华侈8MB的内存用,也不需要在手机历程中华侈额外的8M内存,或者是在系统UI历程中的8MB内存 等等等等。相信我,你不会注重到用OpenGL来绘制一些近似状况栏或是华美的动画是完全没有益处的。

  8.硬件加速并非流利UI的“解药”。我们为了UI的流利考试考试了良多分歧的体例,好比耸ё仝1.6中惹人的对前台/后台历程的调剂策略,在2.3中的对输入系统的重写,”峻厉模式”的使用,并发的垃圾收受接管机制,载入器等等。如不美观你想达到60fps的帧速,你只有20毫秒的时刻来措置每帧的内容。这时刻其实不长,光是在UI历程中篡夺存储卡的操作发生的延时就会年夜于这个时限,尤其是在写操作的时辰。

  9.举些比来发现的一些影响UI流利度的例子:我们注重到在二儿子上,使用4.0时列表的滚动就不如使用2.3时流利。而导致这个现象的原因则是计时骥的轻细漂移:有些时辰应用正在领受触摸事务并在屏幕上绘制,而在上一个动作还没完成的的时辰,就接管到下矣闽事务并起头绘制,导致它丢失踪了当前这帧。尽管发生这种现象的时辰,帧速能达到不变的60FPS.(当然,这个问题已经批改)

  10.当人们斗劲Android跟IOS上浏览器的滚动流利度的时辰,他们所看见的分歧并非开没开启硬件加速所导致。 最初的时辰,Android使用了一种完全分歧的衬着策略,并做了一些折中:网页被转换成一个”显示列表“,持续的在屏幕长进行绘制,而非使用块(Tiles)的形式。它有一个利益:就是在滚动或是缩放的时辰不会发生有的块还没被衬着出来的现象(译者注:早期的IOS上这种现象很是较着,快速滚动到底部时要等一会网页才会一块一块的绘制出来)。 而这个体例的不给力之处就在于页面复杂的时辰,帧速就较着低了。例如Android3.0,浏览器中此刻起头使用块的体例进行衬着,于是它可以在滚动或是放年夜的时辰连结一个不变的帧速,自然也会呈现新的块没有被当即衬着出来的情形。 而每个块都是以软件体例绘制的,我相信在IOS中也是这样的。(在3.0之前的版本中,没有开启硬件加速,基于块的策略也可以使用。而且如我之前提到的,二儿子可以很轻易的达到60FPS)

  11.硬件加速不能如巨匠所想事业般的让绘制的问题实足消逝踪。GPU的机能就是一个很主要的限制。比来一个很有趣的例子:基于英伟达的Tegra2的平板可以很轻易的以60FPS的速度访谒2.5次1280*800分辩率的屏幕中的任何一个像素。此刻考虑到在Android 3.0中切换到所有应用列表的气象:你需要绘制布景(1x 所有的像素)、接着是快捷体例和桌面小工具(假设内容不多,破耗0.5x),接着是所有应用的黑色布景(1x),接着是所有应用的ICON(0.5x)。显然,我们已经跨越了原先的预算了,而此时我们还没完成各个自力窗口元素的拼接并做最后的显示。想要取得60FPS的动画,Android 3.0以及后续版本使用了一系列的小技巧。 其中首要的一个就是: 它将所有的窗口元素平铺在一个层中,而不是挨个拷贝到CPU的缓存中。但即使是这样,我们已然超出预算,幸好我们使用另一个技巧:因为Android中的布景是一个自力的窗口元素,我们可以将它设置的比屏幕更年夜来放置整幅位图,此刻,用户起头滑动,布景跟着行为,此时并不需要任何非凡的绘制,仅仅是移动窗口即可,而因为这个窗口是在一个平铺层上,我们甚至不需要用GPU来将这个窗口元素组织到屏幕中输出。

  12.跟着屏幕分辩率的不竭升高,能否达到60FPS跟GPU的速度尤其是内存总线带宽互相关注。事实上,如不美观你想要晋升硬件的效力,出格注重要晋升内存总线的带宽。良多时辰CPU(出格是带有完美的NEON指令集的CPU)会比内存总线块的多。

  UPDATE:下面居然有这么多谈判,可是我木有能力诠释清嚣张相关的所有问题了。不外我会死力在这里供给一些我认为斗劲有趣的不雅概念。

  有些人认为盖世兔已经有了一个很是流利的UI并指出他们已经超越三儿子并做了良多改良。事实上,巨匠忽略了良多设备的差异,盖世兔的屏幕是480*800而三儿子是720*1280。如不美观二儿子在它480*800的屏幕上都能达到60FPS,拥有更NB的CPU的盖世兔必需得同样流利嘛。

  而两者之间最年夜的分歧就是三儿子需要同时绘制2.4倍于盖世兔的像素。这相当于在单核上晋升到2.4倍的速度。(需要指出 在UI衬着的时辰,多核是没有意义的,因为衬着必需要在一个历程中完成,无法并行)

  这就是为什媚暌共件加速很是主要:跟着像素的晋升,GPU凡是能更好的措置图像的运算。事实上,这是我们在Android中惹人硬件加速的最年夜动力。在720*1280的屏幕上,现有的ARM CPU达到60FPS很吃力,可是经由过程GPU衬着就分歧了。同样,在与盖世兔的斗劲中,同时打开没有硬件加速的应用,在三儿子中无法达到盖世兔同样的60FPS,是因为它得衬着2.4倍于盖世兔的像素。

  在最后,还得说起GPU的此吐矣闽优势:良多绘制的效不美观变得加倍轻易。好比你要以软件形式绘制一个位图,你除了设置一个位移,不能做任何事。仅仅是缩小就得花上相当多的侍旧锁行衬着。而在GPU中,此类转换则相当轻易。这就是为神马新的默认主题Holo使用硬件加速绘制布景。而在没有开启硬件加速的应用中,此类布景会自动去失踪~

  原文地址:https://plus.google.com/105051985738280261832/posts/2FXDCz8x93s

  (声名:后面的良多评论认为我写这个只是为Android不如IOS卡乱找砌词或是不关心用户等等,我在这里需要澄清一下:我之所以写这篇文章,仅仅是为了更正网上传布的关于Android的各类错误认知。我并非是为体味释什么,只不外是想给那些关注Android饶暌怪被网上各类错误认知困扰的童鞋供给参考)

您需要登录后才可以回帖 登录 | 5秒注册

本版积分规则

QQ|手机版|小黑屋|Archiver|济源社区论坛 ( 豫ICP备11010625号 )

GMT+8, 2024-5-14 21:19

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表