Android 界面渲染优化

1.理解Cpu 和GPU
cpu :是中央处理器,主要是处理一些逻辑运算
GPU: 是图像处理,主要是将CPU计算的信息(纹理)渲染出来,也叫做 栅格化;(将向量表示的图信格式表示的图像转换成位图以用来显示)

2.Android 图像显示的过程

xml 定义图像 如: ------通过layoutInflaut 的方法加载到内存中 -----生成Button 对象(里面包含:宽,高,margin padding 的基本信息)------通过CPU进行计算(处理成多维的向量图像 )—将向量图交个GPU (一般是通过openGL ES接口调用GPU) ,GPU进行栅格化,,----然后交个显示器 ,,,显示器通常开启个垂直同步 —如果CPU 和GPU 处理的时间小于16毫秒的话,则进行显示,否则等待下一处理结果,,,

所以如果 CPU和GPU 处理的数据太多,16毫秒中处理不完,则会出现丢帧的情况,,连续丢帧则会出现卡顿的情况

如何避免手机卡顿?(两个方面)
1.减少CPU的时间: 减少xml 转换成对象的时间(可以在代码中直接写布局文件)
2.减少GPU 的时间:减少重复绘制的时间

什么是过度绘制?
CPU的绘制过程,就像刷墙一样,一层层的进行,16ms刷新一次,这样就会造成图层覆盖的现象,即无用的图层还被绘制到底层,造成不必要的浪费。

CPU过度绘制的几种情况:
1.自定义控件中,Ondraw方法做了过多的重复绘制。
2.布局层次太深,重叠行太强,用户看不到的区域cpu 也会绘制,导致耗时操作

如何查看渲染图:
在手机中找到开发者选项,。。。在里面找到 “调试GPU 过度绘制”选择

优化方案:
1,为了减少层级关系,可以在布局文件中去掉默认背景和 容器的背景图片

2.减少布局的嵌套,如布局中 用linerlayout 和relativelayout 两种父布局,可以合并成一个 Relativelayout 进行显示,

  1. 使用merge 减少和父布局的重叠(这个可以利用 SDK tools 里面的工具uiautomatorviewer.dat 能够看出图像的层级关系,,如果当前的布局和父布局是在一条线上,且父布局只有一个子布局,当前的布局的ID 没有利用,则可以将当前的子布局 设置为 merge 然后调整view 位置关系)
  2. 相同的类型layout 布局文件可以使用 include 进行表示,避免重复的添加,,(其实如果之前 GPU已经加载过这个layout,,则会直接使用,不会进行重复的加载,,避免重复的计算)。