本平台的文章更新会有延迟,大家可以关注微信公众号-顾林海,包括年底前会更新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系统的显示原理相关推荐

  1. Android小知识10则(下)

    Android小知识10则(上) github传送门 注: 在目录中点击可以跳转到具体代码页 目录 Chronometer和CountDownTimer计时器 Chronometer的使用 Count ...

  2. Android小知识10则(上)(2018.8重编版)

    Android小知识10则(下) 目录 前言 横竖屏锁定 不同分辨率的图标 将字符串写在资源文件中 为AlertDialog设置点击监听 ProgressDialog了解一下 最后 前言 Androi ...

  3. Android小知识-Fragment

    转载请标明出处:[顾林海的博客] 个人开发的微信小程序,目前功能是书籍推荐,后续会完善一些新功能,希望大家多多支持! ##前言 今天还是总结下Android中的小知识点Fragment,Fragmen ...

  4. Android 小知识

    1.判断sd卡是否存在 boolean sdCardExist = Environment.getExternalStorageState().equals(android.os.Environmen ...

  5. android小知识(1)

    1.Android名称的由来. 大家可能不知道,Android一词的本义原指"机器人",它也是谷歌于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操 ...

  6. android小知识之意图(intent)

    android中的意图有显示意图和隐式意图两种, 显示意图要求必须知道被激活组件的包和class 隐式意图只需要知道跳转activity的动作和数据,就可以激活对应的组件 A 主activity  B ...

  7. Android基础知识巩固系列 Android之四大组件——ContentProvider(内容提供者)

    因为最近要面试,于是打算整理整理一下Android的基础知识,由于之前本人已经学习过大概的Android基础知识,这里主要讲这四大组件.五大存储.六大布局.网络请求等这些内容,其他一些等有时间再整理, ...

  8. Android 底层知识拾零,android原生开发框架

    ------------------------------------------------------------------------------------------------- pa ...

  9. Android开发知识体系!Android面试吃透这一篇就没有拿不到的offer!挥泪整理面经

    1.项目介绍 Flutter是目前比较流行的跨平台开发技术,凭借其出色的性能获得很多前端技术爱好者的关注,比如阿里闲鱼,美团,腾讯等大公司都有投入相关案例生产使用. 基于Flutter+Dart+ch ...

最新文章

  1. mysql xplugin_mysql 5.7.12 新增 X plugin 详解
  2. ffmpeg text relocations
  3. VTK:PolyData之IsoLines
  4. 【启智树NOIP模拟】奇偶【卢卡斯定理】【背包】【bitset】
  5. php导入csv文件,php实现CSV文件导入和导出
  6. matlab usewhitebg,Matlab的:geo​​show的網格和框架
  7. Controller数据导出Excel 详细教程——easypoi-base,easypoi-web,easypoi-annotation
  8. 设计模式之Builder模式 (C++实现)
  9. 一个基于WF的业务流程平台
  10. 北邮 鲁鹏老师 视频笔记
  11. SAP License:SAP结帐操作详细操作指南
  12. 数字电子技术基础阎石老师第五版课后习题解答-很抱歉,其实才写了两道题,大家不要误点进来耽误时间了。但是开始写了又不想删掉,希望日后能补起来吧。
  13. 【十分钟开发物联网】楼宇访客门禁管理(Wifi版)
  14. qq能上网浏览器不可以
  15. 安卓开发中的重力感应传感器
  16. 黑客搜索大法(Google Hacking)
  17. win7计算机组策略打不开,三个步骤解决win7系统本地组策略打不开的问题
  18. 头歌Python实训答案——函数结构
  19. 【104】ntvdm.exe占内存极大的问题
  20. linux su -sh,Linux学习-- su -和 su的区别深入解析

热门文章

  1. TreeView的checked事件
  2. 如何在hexo中支持Mathjax
  3. OpenCV3学习(2.1)——图像Mat数据的访问-at/ptr/iterator
  4. stm32 vscode 编译_vs code+gcc stm32编译环境搭建
  5. 7-5 精准运动 (10 分)
  6. 力扣225-用队列实现栈(C++,附思路及优化思路,代码)
  7. detected idea启动 web_IDEA使用Tomcat服务器出现乱码问题排查过程
  8. vue中warning_vue项目运行提示Warnings while compiling.警告的解决方法
  9. linux内核中的hook函数详解,linux内核中的hook函数详解
  10. comsol 超声声场模拟_新品上市 | COMSOL 物理仿真软件全新发布5.6 版本并推出四个新模块...