布局渲染优化

[toc]
动脑学院视频笔记:

GPU与CPU的区别

image.png

黄色的 Control 为控制器,用于协调控制整个 CPU 的运行,包括取出指令、控制其他模块的运行等; 绿色的 ALU ( Arithmetic Logic Unit )是算术逻辑单元,用于进行数学、逻辑运算;
橙色的 Cache 和 DRAM 分别为缓存和 RAM ,用于存储信息。
从结构图可以看出, CPU 的控制器较为复杂,而 ALU 数量较少。因此 CPU 擅长各种复杂 的逻辑运算,但不擅长数学尤其是浮点运算。

XML文件到屏幕显示的过程

image.png
image.png

卡顿原理分析

Android 系统每隔 16ms 发出 VSYNC 信号 (1000ms/60=16.66ms) ,触发对 UI 进行渲染, 如果每次渲染都成 功这样就能够达到流畅的画面所需要的 60fps ,为了能够实现 60fps ,这意味着计算渲染的大多数操作都必须 在 16ms 内完成。

image.png

16 毫秒的时间主要被两件事情所占用
第一件:将 UI 对象转换为一系列多边形和纹理
第二件: CPU 传递处理数据到 GPU 。
所以很明显,我们要缩短 这两部分的时间,也就是说需要尽量减少对象转换的次数,以及上 传数据的次数

如何减少这两部分的时间 以至于在 16ms 完成呢
  • CPU 减少 xml 转换成对象的时间
  • GPU 减少重复绘制的时间

过度绘制

GPU绘制的过程,就像刷墙一样,一层层的进行,16ms刷一次。这样就会造成,图层覆盖的现象,即无用的图层还会被绘制在底层,造成不必要的浪费。

过度绘制几种情况
  • 自定义控件中onDraw方法做了过多重复绘制
  • 布局层次太深,重叠性太强,用户看不到的区域GPU也会渲染,导致耗时增强
过度绘制查看工具
image.png
image.png

优化步骤

  • 布局中是否有多余背景
    在style中去除主题背景

在Activity中去除主题背景

getWindow().setBackgroundDrawable(null);

推荐使用style 去除 QQ就是这么做的

  • 是否可以删除多余布局(即看是否能删除只有一个子布局的结点)
    使用$$标签减少嵌套
  • 自定义View是否进行了裁剪
  • 布局是否扁平化
    使用相对布局减少线性布局使用,以及现在新出来的约束布局

你可能感兴趣的:(布局渲染优化)