文章内容概要

一、手机界面UI渲染显示流程

二、16ms原则

三、造成卡顿的原因

四、过度绘制介绍、检测工具、如何避免造成过度绘制造成的卡顿

一.手机界面UI渲染显示流程

大家都知道CPU(中央处理器)主要负责数学和逻辑运算,在很早前,CPU还负责图像的显示操作,但是这样会大大的降低CPU的运算性能,所以GPU应运而生,GPU主要负责图像的渲染与显示,至此,CPU只需要给GPU发出指令,GPU再将我们写好的页面栅格化渲染显示出来,以一个button为例!

<Button>属性设置【Width = “100dp”;Height = “100dp”】-->通过LayoutInflater将xml映射成对象加载到内存-->检测<Button>包含的属性信息-->CPU经过计算-->将<Button>处理为多维向量图形→CPU将图形交给GPU→GPU进行图形绘制(栅格化:将图片等矢量资源,转化为一格格像素点的像素图,显示到屏幕上)(哪个位置是什么颜色的像素点,最终将图形铺满。注:手机屏幕由无数个像素点堆积而成)。

总结来说就是CPU将UI对象计算成成多维图形(多边形、纹理),再通过OPENGL进行处理,处理完之后再交给GPU进行栅格化渲染并交给显示器进行显示。

二.16ms原则

由于人眼的特殊构造,对于60fps以下的帧率画面,会给人一种卡顿的现象,所以就出现了16ms原则(1000ms/60fps = 16ms),即要保证页面16ms刷新一次。

Android系统每隔16ms发出vsync信号,触发对UI进行渲染,1s内大约刷新屏幕60次,显示60帧的数据。

fps:画面每秒钟传输的帧率,帧率越高,画面越流程,反之越卡顿

三.造成卡顿的原因

上面我们讲到了16ms原则,那么16ms原则对我们的UI产生了什么样的影响呢?

因为16ms原则,我们显示器将页面显示出来分两种情况:

1.上述步骤在16ms内完成,true→显示器直接显示。

2.上述步骤在16ms内没有完成(可能由于CPU计算的时间过长或者由于GPU的渲染时间过长,最终导致整个流程下来超过了16ms),false-->垂直同步等待下一帧完成。

解释一下垂直同步机制:比如说第一帧在16ms内渲染完成,并且显示出来了,第二帧在上述的处理流程中超过了16ms,在16ms内没有完成,那么,屏幕就不会显示第二帧的数据,依旧只显示第一帧的数据,接下来处理第三帧,第三帧的数据在16ms内处理完了上述的流程,那么结果就是屏幕会将第二帧的数据和第三帧的数据一起显示出来(如果在某一处出现了丢帧的情况,大概率会影响到后面的绘制也会出现丢帧的情况),如果计算器cpu的计算能力和gpu的渲染能力很差,就会出现我们说的UI卡顿的现象。(用LOL举一个例子,比如我们1-10帧都没有在16ms内完成(打团中,UI过于复杂),第11帧在16ms内完成(打完团,回家泡泉水),这时候就会把1-11帧的数据都显示出来,这时候给人的感觉就是花里胡哨的闪现出一堆技能)

看了上面的解释,是不是有一种明朗的感觉了,总的来说就是帧率过低,垂直同步机制的限制下,我们前面几帧的画面渲染不出来,直到某一帧我们的帧率正常了,这时候就会把前面的几帧一起渲染出来,这样就造成了我们所说的视觉上卡顿的现象了。

四.过度绘制介绍、检测工具、如何避免造成过度绘制造成的卡顿

既然我们知道了造成卡顿的原因了,那么,我们应该去如何检测和避免呢?这里就要介绍一下过度绘制了!

1.什么是过度绘制

前面我们说到了手机屏幕是由无数个像素点堆积而成的,一个像素点被我们重复多次的渲染,就是过度绘制

2.过度绘制检测工具

开发者选项-->调试gpu过度绘制-->显示过度绘制区域

原色没有被过度绘制 – 这部分的像素点只在屏幕上绘制了一次。
蓝色1次过度绘制– 这部分的像素点只在屏幕上绘制了两次。
绿色2次过度绘制 – 这部分的像素点只在屏幕上绘制了三次。
粉色3次过度绘制 – 这部分的像素点只在屏幕上绘制了四次。
红色4次过度绘制 – 这部分的像素点只在屏幕上绘制了五次。
我们的目标是尽量减少红色,看到更多的蓝色!!!
以轻易贷为例:
3.如何避免过度绘制

1)避免UI层级嵌套的过深

2)减少不必要的背景设置(根节点背景是否可以不要、系统主题背景是否可以不要等等)

3)使用merge标签减少布局嵌套层次

4)使用ConstraintLayout替代常见嵌套布局,减少布局层次

5)在自定义view的时候,使用Canvas的clipRect和clipPath方法限制View的绘制区域(覆盖区域不需要绘制)

Android 布局渲染流程与卡顿优化的更多相关文章

  1. android中app卡顿优化问题

     所谓app卡顿原因就是在运行时出现了丢帧,还可能是UI线程被阻塞.首先来一下丢帧现象,android每16ms会对界面进行一次渲染,如果app的绘制.计算等超过了16ms那么只能等下一个16ms才能 ...

  2. Android性能优化----卡顿优化

    前言 无论是启动,内存,布局等等这些优化,最终的目的就是为了应用不卡顿.应用的体验性好坏,最直观的表现就是应用的流畅程度,用户不知道什么启动优化,内存不足,等等,应用卡顿,那么这个应用就不行,被卸载的 ...

  3. Android高级开发-布局渲染流程与优化

    CPU(中央处理器)与GPU(图像处理器) 主要是设计目标不同,针对不同的应用场景.多缓存多分支,适用于复杂的逻辑运算,主要负责Measure,Layout,Record,Execute的计算操作. ...

  4. Android 卡顿优化 2 渲染优化

    1.概述 2015年初google发布了Android性能优化典范,发了16个小视频供大家欣赏,当时我也将其下载,通过微信公众号给大家推送了百度云的下载地址(地址在文末,ps:欢迎大家订阅公众号),那 ...

  5. Android 卡顿优化 4 布局优化实际技巧

    今天分享一些layout布局书写中的一些技巧,希望看过之后你也一样可以写出性价比高的布局.我个人的目标是用最少的View写出一样效果的布局.因为我相信View的数量减少伴随着的就是层级的减少.从而达到 ...

  6. Android 卡顿优化 1 卡顿解析

    1, 感知卡顿 用户对卡顿的感知, 主要来源于界面的刷新. 而界面的性能主要是依赖于设备的UI渲染性能. 如果我们的UI设计过于复杂, 或是实现不够好, 设备又不给力, 界面就会像卡住了一样, 给用户 ...

  7. Android ScrollView嵌套Recyclerview滑动卡顿,松手即停问题解决;

    假如你的布局类似这样的: <ScrollView android:layout_width="match_parent" android:layout_height=&quo ...

  8. 彻底解决 Intellij IDEA 卡顿 优化笔记,重要的快捷键

    由于工作中经常出现分支各种切换,使用Eclipse便不再像以前那么舒服了,不停的修改工作空间,每次修改完工作空间又是一堆一堆的个性化设置,来回的切换,真的很累.我们做软件的,怎么能不去尝试新鲜的呢,毕 ...

  9. 彻底解决 intellij IDEA 卡顿 优化笔记

    由于工作中经常出现分支各种切换,使用Eclipse便不再像以前那么舒服了,不停的修改工作空间,每次修改完工作空间又是一堆一堆的个性化设置,来回的切换,真的很累.我们做软件的,怎么能不去尝试新鲜的呢,毕 ...

随机推荐

  1. C#发送邮件(内容中有图片)

    用微软的System.Net.Mail发送邮件,有些时候发邮件需要邮件内容中添加图片. 对象解释 SmtpClient类:允许应用程序使用简单邮件传输协议 (SMTP) 发送电子邮件.MailAddr ...

  2. canvas绘制星星和月亮

    用变量的方式绘制一个五角星,首先求五角星十个顶点的坐标. 可以把每个五角星看成外顶点用一个大圆绘制,内顶点用小圆绘制.在坐标系(0deg)下,根据每个顶点的角度和圆的半径求得x,y. 而每个大顶点相差 ...

  3. HTTP中的Accept-Encoding、Content-Encoding、Transfer-Encoding、Content-Type

    Accept-Encoding和Content-Encoding Accept-Encoding和Content-Encoding是HTTP中用来对采用何种压缩格式传输正文进行协定的一对header. ...

  4. R语言入门1:安装R和RStudio

    R语言入门1:安装R和RStudio 曹务强 中科院遗传学博士研究生 9 人赞同了该文章 1. Windows安装R 在Windows系统上,安装R语言比较简单,直接从R的官方网站下载,按照正常的软件 ...

  5. Mac使用iTerm2 一键免密登录

    iTerm是mac平台很好用的ssh管理工具,今天给大家介绍一种使用iTerm一键登陆服务器优雅的方式,这样就不需要每次连接服务器时都需要输入端口号.用户名.ip地址.密码(为了安全,服务器密码都好长 ...

  6. How To Restore Rman Backups On A Different Node When The Directory Structures Are Different (Doc ID 419137.1)

    How To Restore Rman Backups On A Different Node When The Directory Structures Are Different (Doc ID ...

  7. 爬取编程常用词汇,保存为Excel

    编程常用词汇 import requests import openpyxl from lxml import etree import re url = 'https://www.runoob.co ...

  8. 什么是uWSGI、WSGI、uwsgi、wsgiref、werkzeug

    我不是代码的生产者,我只是知识的搬运工 uWSGI.WSGI.uwsgi.wsgiref.werkzeug

  9. 加速自己的hexo,使用GitHub+Coding实现国内外网站加速

    在配置好hexo之后,我们发现访问网站很慢,但又不是我们使用的主题的问题,那么就是网络环境的影响,即使我们使用了CDN加速,但还是没有我们国内的网站访问起来快速,(听说去美国的服务器要经过太平洋下面的 ...

  10. 第05组 Beta冲刺(2/4)

    第05组 Beta冲刺(2/4) 队名:天码行空 组长博客连接 作业博客连接 团队燃尽图(共享): GitHub当日代码/文档签入记录展示(共享): 组员情况: 组员1:卢欢(组长) 过去两天完成了哪 ...