一、屏幕的刷新机制
1,屏幕的刷新要在16毫秒内完成,因为人眼与大脑协作无法感知超过60桢,然后通过1000毫秒除以60帧结果约等于16毫秒。如果屏幕刷新时间超过了16毫秒结果会导致页面的卡顿
2,Android屏幕刷新主要是围绕刷新率和帧率这两个方面展开
2.1.1,刷新率你可以这么理解,刷新率就是屏幕每秒画面被刷新的次数,打个比方我们在看电影时看到的其实是一副一副静止的画面,就象放幻灯片,因此刷新率越高越好,同时刷新率的高低会影响屏幕的价格。
2.1.2,帧率是指GPU在一秒内操作的画面帧数
3,UI刷新的一个过程中一般包括CPU,GPU,display3个部分
display简单理解的话是屏幕或者显示器
CPU是计算数据的,然后把计算好的数据交给GPU
3GPU会对读取的数据进行渲染,在把渲染好的数据存在buffer里面最后display每个一段时间把buffer里面的数据呈现出来
当然啦这是理想的状态了,但是现实往往是很残酷的
如果说GPU存入的数据的时间和display的时间不一致的话就会出问题了,因此android为了保证GPU和display刷新的速度保持一致,针对这个情况引入了VSync机制。
VSync机制:中文翻译过来是垂直同步。可以理解为帧同步,这个的工作原理就是android每隔16毫秒发出一次VSync信号触发ui得渲染更新,只有收到了这个信号之后才进行画面得绘制,而VSync最重要作用就是防止画面撕裂,如果说显卡的输出帧的速度高于显示器刷新的速度,从而导致显示器并不能及时处理显卡的输出的帧最终会出现多个帧,那么多个帧造成的结果就是画面撕裂了。
二、布局的选择
1,Framelayout能实现的需求的优先使用Framelayout因为Framelayout是最简单高效的,之所以说他简单我们可以通过查看源码的函数个数,同时Framelayout也是代码逻辑相对更简单的
2,其次优先选择Relativelayout,因为Relativelayout可以实现Linerlayout嵌套才可以实现的布局,当然在Relativelayout和Linerlayout同时满足需求时优先使用Linerlayout,因Relativelayout功能相对复杂,同时还会有重复绘制的情况,之所以重复绘制两次是为了确保Relativelayout的子视图被放置正确的位置,如果Linerlayout说子视图设置了wieght的属性,那么Linerlayout也需要测量两次,已确定子视图的确切位置。最需要注意的是,嵌套的Linearlayout或者Relativ elayout测量的次数会随着子数增长,两层嵌套会进行4次测量,三层嵌套会进行6次测量以此类推。。。
3,ConstraintLayout在AndroidStudio2.2中新加的功能之一,它是一个扁平化布局,性能方面和RelativeLayout比的话将高出大约40%,因此Google也是推荐开发者使用这个布局
三:避免overdraw
overdraw是指屏幕上某一个像素点在同一帧的时间绘制了多次,在多层的UI层次结构中如果是不可见的UI也在做绘制的操作就会导致某些像素去被绘制了多次,浪费了大量的CPU和GPU的资源,如果需要检查overdraw可以通过打开开发者选项然后开启查看过度绘制选项可以看到,这里四种颜色分别展示着不同层度的overdraw的情况,他们颜色顺序分别是蓝-绿-粉-红相对应的是overdraw*2 overdraw*3 overdraw*4 overdraw*5或者更多,如果需要优化的话可以去掉父布局或者是容器view无用的背景色。
三,多使用 include merge ViewStub
include :相同的页面只需要写一次,在需要的地方include即可,提高了共通布局的复用性。
merge :是include的标签辅助拓展,可以防止在引入布局时产生多余的布局嵌套,解决布局的层级的优化,减少布局嵌套的层次提高布局加载的效率,merge的布局文件必须merge,merge使用的属性是父布局的属性
ViewStub:只有在加载该布局的时候才占用资源,INVISIBLE状态下是不会绘制出来的,ViewStub虽说是View的一种,但是它没有大小,没有功能,同时也不参与布局,它的资源消耗非常低,将它放置在布局当中,基本上可以完全认为不消耗性能的。