`
android_mylove
  • 浏览: 400072 次
社区版块
存档分类
最新评论

【整理】关于Android图形系统的一些事实真相

 
阅读更多
现在网上满天飞的各类关于Android图像渲染的水文实在让我不爽,下面给大家一些关于Android硬件渲染的事实真相,硬件加速并非大家想的那么完美,而我们也一直在改进!1. Android 一直在使用硬件加速。实际上从1.0版本之后,所有的窗口元素的合成与显示都是通过硬件完成的。

2.这意味着许多你所看见的动画都是被加速过的:按钮的显示、通知栏下拉的阴影、不同Activity之间的切换动画、弹出窗口以及提示框的显示和隐藏等等等等。

3.Android以前使用软件方式(与硬件加速相对应)来控制各个窗口元素的渲染,例如下图的UI,其中包括四个窗口组件:状态条、壁纸、桌面上的的启动器、以及菜单。如果其中一个元素更改了自身的内容,例如高亮一个菜单条目,对于3.0之前的版本,系统使用软件方式来绘制新的内容,然而并非所有的元素都需要被重新绘制,同时各个窗口元素的拼接也是通过硬件方式完成的。类似的,任何窗口的移动:例如菜单的上下运动是完全通过硬件方式渲染的。



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却又被网上各种错误认知困扰的童鞋提供参考)

分享到:
评论

相关推荐

    android系统原理及开发要点详解

     第6章“Android的GUI系统”,包括Android GUI系统架构、底层的pixelflinger和libui库、Surface系统、Skia和2D图形系统、Android的OpenGL和3D图形系统等内容。  第7章“Android的Audio系统”,主要是音频的输入...

    android 调用系统自带录音机

    在Android平台上,调用系统自带的录音机是开发者经常遇到的需求,这可以帮助用户方便地录制音频并集成到应用中。本文将深入探讨如何在Android应用中实现这一功能,并结合"AutoRecoder"这个示例来讲解相关知识点。 ...

    Android系统源代码情景分析 / 罗升阳著

    在内容上,《Android系统源代码情景分析(含CD光盘1张)》结合使用情景,全面、深入、细致地分析了Android系统的源代码,涉及到Linux内核层、硬件抽象层(HAL)、运行时库层(Runtime)、应用程序框架层...

    Android系统架构概述PPT

    Android系统使用的Linux内核包含了一些专用驱动,例如Logger、Binder、Ashmem、Wakelock、Low-Memory Killer和Alarm等,这些Android专用驱动构成了Android运行时的基石。Android运行时从下到上又包括了HAL层、应用...

    android电子点餐系统源码

    《Android电子点餐系统源码解析》 在移动互联网飞速发展的今天,Android电子点餐系统已经成为餐饮行业的必备工具,它极大地提升了餐厅的服务效率和顾客的用餐体验。本篇文章将深入探讨一个基于Android平台的电子...

    Android调用系统闹钟

    最近在做调用系统闹钟,在网上找了半天发现很多人都遇到同样的问题,由于厂商不同闹钟的包名也是不同的,比如HTC:com.htc.android.worldclock,三星:com.sec.android.app.clockpackage。在经过深思之后写了一个...

    android系统原理及开发要点详解_韩超_梁泉 4

     第6章“Android的GUI系统”,包括Android GUI系统架构、底层的pixelflinger和libui库、Surface系统、Skia和2D图形系统、Android的OpenGL和3D图形系统等内容。  第7章“Android的Audio系统”,主要是音频的输入...

    android设置系统时间 源代码 步骤说明

    在Android平台上,对系统时间进行修改通常涉及到权限和特定的API调用。下面将详细讲解如何在Android中实现这一功能,以及提供一个简单的源代码实例。 首先,Android系统时间的修改需要`WRITE_SETTINGS`权限。在...

    Android系统源代码情景分析 PDF 完整版 ZIP.002(二个压缩包)

    在组织上,本书将上述内容划分为初识Android系统、Android专用驱动系统和Android应用程序框架三大篇章。初识Android系统篇介绍了参考书籍、基础知识以及实验环境搭建;Android专用驱动系统篇介绍了Logger日志驱动...

    Android SDK Platform(Android 5.1系统)

    2. **系统库和API**:Android SDK Platform包含了大量的系统库文件,这些库文件是开发应用的基础,如Android运行时库、媒体库、图形库等。API接口则提供了与系统服务交互的能力,例如网络通信、文件操作、设备硬件...

    android graphics

    ### Android图形系统详解 #### 一、概述 在深入探讨Android图形系统之前,我们首先需要了解Binder IPC(Inter-Process Communication)的基本概念及其在Android系统中的应用。因为Android图形系统高度依赖于Binder...

    Android 三维图形演示代码

    在Android平台上,开发三维图形应用是一项复杂而富有挑战性的任务,因为这涉及到对硬件加速图形接口的深入理解和熟练使用。本示例项目“Android 三维图形演示代码”提供了一个具体的实例,展示了如何在Android设备上...

    基于android图书管理系统

    《基于Android图书管理系统详解》 在移动互联网时代,利用Android平台开发各类应用程序已经成为开发者们的首选。本项目“基于Android图书管理系统”就是一个典型的案例,它旨在为用户提供一个方便、高效的图书管理...

    android 系统签名工具

    在Android系统中,签名工具是开发过程中的重要环节,它确保了应用的完整性和安全性。Android应用程序在发布之前必须经过签名,以便系统可以验证其来源并允许安装。本篇文章将详细解析“Android系统签名工具”的使用...

    android OA系统

    【Android OA系统详解】 OA(Office Automation)系统,即办公自动化系统,是一种广泛应用于企业管理中的信息化工具,旨在提升办公效率,实现无纸化办公。在移动互联网时代,Android平台上的OA系统更是受到青睐,...

    Android系统级深入开发——移植与调试 pdf

    《Android系统级深入开发——移植与调试》这本书深入探讨了Android系统的内部工作原理,涵盖了从系统移植到调试的全过程。在Android开发领域,系统级的深入理解是提升开发者能力的关键,下面将对其中的主要知识点...

    Android手机点餐系统

    《Android手机点餐系统详解》 在信息化时代,Android手机点餐系统已成为餐饮业不可或缺的一部分。这个系统由客户端、服务器和数据库三大核心组件构成,旨在为用户提供便捷、高效的点餐体验。下面,我们将深入探讨这...

    Android无线点餐系统【源码】

    《Android无线点餐系统源码解析与应用》 在当今数字化时代,餐饮业也开始逐步引入智能化的管理系统,其中Android无线点餐系统就是一种常见的解决方案。本文将深入探讨这个系统的源码,帮助开发者理解和掌握其核心...

    Android技术内幕.系统卷(扫描版)

    《android技术内幕:系统卷》 前言 第1章 准备工作 /1 1.1 深入认识android /2 1.1.1 android的系统构架 /2 1.1.2 android的初始化流程 /5 1.1.3 各个层次之间的相互关系 /8 1.1.4 android系统开发(移植)和应用...

    Android经典书籍

    第六章介绍Android工具包(toolkit),在第七章向你介绍如何设计和发布你的应用程序,第八章介绍了两个数据存储系统,在第九章中,你可以学会如何定位和使用地图,10~12章介绍了图形编程。第十三章将更加深入地介绍...

Global site tag (gtag.js) - Google Analytics