Android小知识-了解下Android系统的显示原理
本平台的文章更新会有延迟,大家可以关注微信公众号-顾林海,包括年底前会更新kotlin由浅入深系列教程,目前计划在微信公众号进行首发,如果大家想获取最新教程,请关注微信公众
在Android系统中应用层负责绘制,系统层负责渲染,通过进程间通信把应用层需要绘制的数据传递到系统层,系统层服务通过刷新机制把数据更新到屏幕上,图形显示系统采用的是C/S架构。
Android中View绘制需要三个步骤,通过Measure和Layout来确定当前需要绘制的View所在的大小和位置,接着通过Draw绘制到suface。
Measure用深度优先原则递归得到所有视图的宽和高,获取当前View的正确宽度childWidthMeasureSpec和高度childHeightMeasureSpec之后,可以调用它的成员函数Measure来设置大小。如果当前正在测量的子视图是一个视图容器,那么它又会重复执行操作,直到它的所有子孙视图的大小测量完成为止。Layout也是采用深度优先原则递归得到所有视图的位置,当子View在应用程序窗口左上角的位置确定后,再结合它在前面测量过程中确定的宽度和高度,就可以完全确定它在应用程序窗口中的布局。Draw采用两种绘制方式,分别是软件绘制(CPU)和硬件加速(GPU),硬件加速是在Android 3.0开始采用的。
硬件加速的优点是UI的显示和绘制的效率高于CPU绘制,但它也存在明显的缺点,GPU的功耗比CPU高,造成耗电问题;某些接口和函数不支持硬件加速,造成兼容问题;使用OpenGL的接口至少需要8MB内存,造成内存过大问题。
将数据渲染到屏幕上,是通过系统级进程中的SufaceFlinger服务来实现的,应用层绘制到缓存区,SufaceFlinger把缓存区数据渲染到屏幕,由于是两个不同的进程,所以Android的匿名共享内存SharedClient缓存需要显示的数据来达到目的。
FPS代表每秒传递的帧数,Android系统每隔16ms发出VSYNC(垂直中断)信号,触发对UI进行渲染,如果每次渲染都成功,这样就能达到流畅的画面所需的60FPS。如果未能在16ms内发出信号,触发对UI进行渲染,就会造成丢帧现象,用户会感到卡顿不流畅。
Android 4.1版本推出了Project Butter。Project Butter对Android Display进行了重构,引入三个核心元素:VSYNC、Triple Buffer和Choreographer。
VSYNC是一种定时中断,一旦受到VSYNC中断,CPU就开始处理各帧数据。Choreographer起一个调度的作用,将绘制工作统一到VSYNC某个时间点上,使应用的绘制工作有序。Triple Buffer是第三块绘制的Buffer,减少显示内容的延迟,之前采用的是双缓冲,所谓的双缓冲就是使用两个缓冲区,其中一个称为Front Buffer,另外一个成为Back Buffer,UI在Back Buffer中绘制,然后再和Front Buffer交换,渲染到显示设备中,当两个Buffer不够用时,就会采用三级缓冲来增强。
下图是Android 4.1之前未加入VSYNC的绘制流程图:
Display显示第0帧数据,此时CPU和GPU渲染第1帧画面,而且赶在Display显示下一帧前完成,因为渲染及时,Display在第0帧显示完成后,也就是第1个VSync后,正常显示第1帧。 由于某些原因,比如CPU资源被占用,系统没有及时地开始处理第2帧,直到第2个VSync快来前才开始处理 ,第2个VSync来时,由于第2帧数据还没有准备就绪,显示的还是第1帧。就出现了所谓的“Jank”。 当第2帧数据准备完成后,它并不会马上被显示,而是要等待下一个VSync。
下图是Android 4.1加入VSYNC的绘制流程图:
CPU/GPU根据VSYNC信号同步处理数据,可以让CPU/GPU有完整的16ms时间来处理数据,减少了jank。
双缓冲下当CPU和GPU处理时间过长时流程图如下:
当CPU/GPU的处理时间超过16ms时,在第二个16ms时间段内,Display应该显示B帧,但因为GPU还在处理B帧,导致A帧重复显示。并且在第二个16ms内,CPU什么事情都做不了,这是因为A Buffer由Display在使用,B Buffer由GPU在使用。
三级缓冲绘制图如下:
当第一次VSync发生后,CPU不用再等待了,它会使用第三个buffer C来进行下一帧数据的准备工作。虽然对缓冲区C的处理所需时间同样超过了16ms,但这并不影响显示屏,第2次VSync到来后,它选择buffer B进行显示;而第3次VSync时,它会接着采用C,而不是像double buffering中所看到的情况一样只能再显示一遍B了。这样子就有效地降低了jank。
搜索微信“顾林海”公众号,定期推送优质文章。
Android小知识-了解下Android系统的显示原理相关推荐
- Android小知识10则(下)
Android小知识10则(上) github传送门 注: 在目录中点击可以跳转到具体代码页 目录 Chronometer和CountDownTimer计时器 Chronometer的使用 Count ...
- Android小知识10则(上)(2018.8重编版)
Android小知识10则(下) 目录 前言 横竖屏锁定 不同分辨率的图标 将字符串写在资源文件中 为AlertDialog设置点击监听 ProgressDialog了解一下 最后 前言 Androi ...
- Android小知识-Fragment
转载请标明出处:[顾林海的博客] 个人开发的微信小程序,目前功能是书籍推荐,后续会完善一些新功能,希望大家多多支持! ##前言 今天还是总结下Android中的小知识点Fragment,Fragmen ...
- Android 小知识
1.判断sd卡是否存在 boolean sdCardExist = Environment.getExternalStorageState().equals(android.os.Environmen ...
- android小知识(1)
1.Android名称的由来. 大家可能不知道,Android一词的本义原指"机器人",它也是谷歌于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操 ...
- android小知识之意图(intent)
android中的意图有显示意图和隐式意图两种, 显示意图要求必须知道被激活组件的包和class 隐式意图只需要知道跳转activity的动作和数据,就可以激活对应的组件 A 主activity B ...
- Android基础知识巩固系列 Android之四大组件——ContentProvider(内容提供者)
因为最近要面试,于是打算整理整理一下Android的基础知识,由于之前本人已经学习过大概的Android基础知识,这里主要讲这四大组件.五大存储.六大布局.网络请求等这些内容,其他一些等有时间再整理, ...
- Android 底层知识拾零,android原生开发框架
------------------------------------------------------------------------------------------------- pa ...
- Android开发知识体系!Android面试吃透这一篇就没有拿不到的offer!挥泪整理面经
1.项目介绍 Flutter是目前比较流行的跨平台开发技术,凭借其出色的性能获得很多前端技术爱好者的关注,比如阿里闲鱼,美团,腾讯等大公司都有投入相关案例生产使用. 基于Flutter+Dart+ch ...
最新文章
- mysql xplugin_mysql 5.7.12 新增 X plugin 详解
- ffmpeg text relocations
- VTK:PolyData之IsoLines
- 【启智树NOIP模拟】奇偶【卢卡斯定理】【背包】【bitset】
- php导入csv文件,php实现CSV文件导入和导出
- matlab usewhitebg,Matlab的:geo​​show的網格和框架
- Controller数据导出Excel 详细教程——easypoi-base,easypoi-web,easypoi-annotation
- 设计模式之Builder模式 (C++实现)
- 一个基于WF的业务流程平台
- 北邮 鲁鹏老师 视频笔记
- SAP License:SAP结帐操作详细操作指南
- 数字电子技术基础阎石老师第五版课后习题解答-很抱歉,其实才写了两道题,大家不要误点进来耽误时间了。但是开始写了又不想删掉,希望日后能补起来吧。
- 【十分钟开发物联网】楼宇访客门禁管理(Wifi版)
- qq能上网浏览器不可以
- 安卓开发中的重力感应传感器
- 黑客搜索大法(Google Hacking)
- win7计算机组策略打不开,三个步骤解决win7系统本地组策略打不开的问题
- 头歌Python实训答案——函数结构
- 【104】ntvdm.exe占内存极大的问题
- linux su -sh,Linux学习-- su -和 su的区别深入解析
热门文章
- TreeView的checked事件
- 如何在hexo中支持Mathjax
- OpenCV3学习(2.1)——图像Mat数据的访问-at/ptr/iterator
- stm32 vscode 编译_vs code+gcc stm32编译环境搭建
- 7-5 精准运动 (10 分)
- 力扣225-用队列实现栈(C++,附思路及优化思路,代码)
- detected idea启动 web_IDEA使用Tomcat服务器出现乱码问题排查过程
- vue中warning_vue项目运行提示Warnings while compiling.警告的解决方法
- linux内核中的hook函数详解,linux内核中的hook函数详解
- comsol 超声声场模拟_新品上市 | COMSOL 物理仿真软件全新发布5.6 版本并推出四个新模块...