布局渲染流程

布局渲染流程

1,以前一篇文章讲解了CPU和GPU的工做原理,不懂的能够去参考参考。

2,60fps刷新频率的由来。

  • 12fps:因为人的眼睛,在每秒约10到12帧之上,人的眼睛看到的画面的帧率认为是连贯的。
  • 24fps:有声电影的拍摄及播放均为24帧,对于通常人而言,能够接受了。
  • 30fps:早起的高动态的电子游戏,帧率少于30帧,会显得不连贯。那是由于没有动态模糊,使流畅度下降。
  • 60fps: 当人和手机交互时,如触摸和反馈,在60帧如下,是人能够感觉到变化的,60帧以上是感受不到变化的。
  • 当画面低于60帧时,会感受到画面的卡顿或者迟滞现象。

android系统每隔16ms会发出vsync信号(1000ms/60=16.66ms),触发对UI进行渲染,若是每次都成功,这样就能达到流畅的画面所须要的60帧。也就是意味着渲染的大部分操做都必须在16ms内完成。android

3,卡顿原理分析

当这一帧画面渲染时间超过16ms的时候,垂直同步机制会让显示器硬件等待GPU完成栅格化渲染操做。 这样这一帧画面就会多等待16ms,甚至更多时间,就会形成画面停顿。 以下图:工具

4,16ms时间在干什么

  • 第一件事:将UI对象转换为一系列的多边形对象和纹理。
  • 第二件事:CPU传递处理数据到GPU。
  • 因此咱们要尽可能的减小这两件事的时间,也就是减小UI对象转换和数据之间的传递。

5,如何减小这两部分时间,以致于在16ms内完成。

  • cpu减小xml转换对象的时间。
  • GPU减小重复绘制时间。

6,什么是过分绘制。

GPU的绘制,就像刷墙同样,一层一层的覆盖,16ms绘制一次,这样无用的层,在底部还在绘制,形成浪费。布局

7,GPU过分绘制的几种状况

  • 1,在自定义控件中,onDraw方法作了过多的重复绘制。
  • 2,布局层次太深,重复性太强,用户看不到的区域GPU也会渲染,致使耗时增长。

8,过分绘制查看工具

在手机的开发这选项里面,有GPU调式选项。咱们是须要尽可能减小红色优化

  • 蓝色:表明过分绘制一次(无过分绘制)。
  • 淡绿:表明过分绘制两次。
  • 淡红:过分绘制三次。
  • 深红:过分绘制四次。

9,安卓系统有没有给咱们作优化呢。

CPU转移到GPU是一件很麻烦的事情,所幸的是OpenGl ES能够把那些须要渲染的纹理Hold在GPU Memory里面,在下次须要渲染的时候直接进行操做,因此若是你更新了GPU所hold住的纹理内容,那么以前保存的状态就丢失了。 在android里面那些由主题所提供的的资源,例如Bitmaps,Drawables都是一块儿打包到统一的Texture纹理当中,而后再传递到GPU里面,这意味着每次你须要使用这些资源的时候,都是直接从纹理里面进行获取渲染的。固然随着UI组件的愈来愈丰富,有了更多的演变的形态。例如显示图片的时候,须要先通过GPU的计算加载到内存中,而后传递给GPU进行渲染,而后传递给GPU进行渲染。文字的显示比较复杂,须要先通过CPU换算成纹理,而后交给GPU进行渲染,返回当CPU绘制单个字符的时候,再从新引用通过渲染的内容。动画则存在一个更加复杂的操做流程。 为了可以使得App流畅,咱们须要在每帧16ms之内处理完全部的CPU与GPU的计算,绘制,渲染等等操做。动画

10,布局优化原则

  • 1,减小没必要要嵌套。
  • 2,使用merger避免与父容器重叠。

注意:

  • 1,减小过分绘制,其实就是减小CPU的计算时间。
  • 2,调用Invalidate()重绘View时,在7.0以前(不包含7.0),调用Invalidate()时,将会从新调用onMesure(),onLayout(),onDraw()方法。当在7.0以后(包含7.0),调用Invalidate()时,就只调用onDraw()方法,由于当位置变换时,onMesure(),onLayout()方法会自动调用更新,当位置变换的时候,是在先CPU里面更新,而后再发送给GPU更新。当位置不变,只是颜色改变时,就只是在GPU里面更新。