首要声明:此文是本人在学Android自行总结的知识点,如果帮到你们我会很高兴。如果大佬们发现本文有错误的地方请指出,我会了解并进行改正。
本文主要讲的是:内存管理-----UI卡顿篇。
我是通过一下思路进行总结的:
1. 首先我们要知道为什么会出现卡顿?
2.再接着我们要知道是什么会引起卡顿?
3.当我们知道问题的所在之处后,我们应该了解怎样解决他。
接触安卓的老铁们,一定大多都知道 16ms 原则吧。
所谓16ms 原则 :即Android 系统会每隔16ms 会发出VSYNSC信号重新绘制我们的activity界面。为什么是16毫秒呢?这是因为Android设定刷新频率是60FPS(Frame Per Second),也就是说每秒60帧刷新率,约合16ms刷新一次卡顿;
从用户的角度来说:App操作起来缓慢,相应不及时,列表滑动一顿一顿,动画刷新不流畅等等一些直观感受。
从系统角度来说:屏幕刷新帧率不稳定,无法保证每帧绘制60帧,也就是说有掉帧情况。
UI卡顿的原理:Android 每隔16ms就会绘制一次activity,通过上述结论我们知道,如果一些原因导致了我们的逻辑cpu耗时,Gpu耗时大于16ms,UI无法完成一次绘制,那么就会造成卡顿。
过度绘制:overdraw(过度绘制)描述了某个项目在同一帧被绘制了多次。在多层次UI结构里面,如果不可见UI也做了绘制操作,这就会导致 某些像素区域内被绘制了多次,这就浪费了大量cpu以及Gpu资源。我们可以开启调试工具,打开开发者设置 显示Gpu过度绘制显示情况。一般步骤:设置 ->开发者选项 ->调试cpu过度绘制 ->显示cpu过度绘制。
深红:意味着overdraw 4倍 ,像素绘制了5次甚至更多次,这是错误的,需要修复;
淡红:意味着overdraw3倍 ,像素绘制了4次,小范围可以接受;
绿色:意味着overdraw 2倍 ,像素绘制了3次,中等大小绿色区域是可以接受的,但是还是应该优化,减少他们;
蓝色:意味着overdraw 1倍 ,像素绘制了2次,大片蓝色还是可以接受的。
常见卡顿原因以及解决方案
一.过度绘制
1.去除不必要的背景色:
- 设置窗口景色为通用背景色,去除根部局背景色。
- 若页面背景色与通用背景色不同一致,在页面渲染完成后移除窗口背景色。
- 去除和列表相同item背景色。
2.布局视图扁平化
- 移除嵌套布局
- 使用merge ,include标签
- 使用性能更小的布局(ConstraintLayout)
3.减少透明色的使用,alpha的使用
- 通过半透明色值代替(#77000000)代替
二.UI线程的复杂运算(ANR为卡顿极致)
解决方式:使用Traceview工具分析
三.频繁的GC
- 频繁GC的原因: 内存抖动:即大量对象被创建又在短时间内马上被释放 瞬间产生大量对象会严重占用Young Generation 内存区域
- 当达到阀值,剩余空间不够时候,也会出发GC,每次分配对象需要占用很少内存,但是叠加在一起会增加heap压力,从而触发更多GC。
解决方案:瞬间大量产生对象一般因为我们在代码循环中new对象,或是在onDraw 中创建对象等。尽量不要在大循环中大量使用局部变量。