Android面试系列文章2018之内存管理之UI卡顿篇
1.UI卡顿的原理
60ftp –> 16ms: Android系统每隔16ms都会对界面进行渲染一次,造成卡顿的原因就是Android系统在渲染的时候丢帧了, 16ms = 1000/60hz,相当于60fps(每秒帧率)。这是因为人眼与大脑之间的协作无法感知超过60fps的画面更新。12fps大概类似手动快速翻书的帧率,这个速度明显可以感知是不够顺滑的。24fps使得人眼感知的是连续线性运动,24fps是电影胶圈通常使用的帧率,这个帧率可以支撑大部分电影画面需要表达的内容。但是地域30fps是无法顺畅表现绚丽的画面内容,此时需要使用60fps来达到想要的效果。因此,如果应用没有在16ms内完成屏幕刷新的全部逻辑操作,就会发生卡顿。因为Android系统每隔16ms就会发出VSYNC信号,触发对UI进行渲染,VSYNC是Vertical Synchronization(垂直同步)的缩写,可以简单的把它认为是一种定时中断。在Android 4.1中开始引入VSYNC机制。
过度绘制(overdraw): Overdraw(过度绘制)描述的是屏幕上的某个项目在同一帧内被绘制了多次。在多层次的UI结构里面,如果不可见的UI也在做绘制的操作,这就会导致某些像素区域内绘制了 多次,这就浪费了大量的CPU以及GPU资源。可以开启调试工具,打开开发者设置来显示GPU过度绘制显示情况。一般步骤:设置-> 开发者选项->调试GPU过度绘制->显示GPU过度绘制 (不同的手机操作路径不一致,但是大体差不多)
深红: 意味着overdraw 4倍。像素绘制了5次或者更多,这是错误的,需要修复;
淡红: 意味着overdraw 3倍。像素绘制了4次,小范围可以接受。
绿色: 意味着overdraw 2倍。像素绘制了3次。中等大小的绿色区域是可以接受的,但是还是应该优化,减少他们。
蓝色: 意味着overdraw 1倍。像素绘制了2次。大片的啦色还是可以接受的。
优化的目标就是减少红色的Overdraw,看到更多的蓝色区域。
2.UI卡顿原因
[1]人为在UI线程中做轻微耗时操作,导致UI线程卡顿。
[2]布局Layout过于复杂,无法在16ms内完成渲染。
[3]同一时间动画执行次数过多,导致CPU或者GPU负载过重。
[4]View过度绘制,导致某些像素在同一帧时间内被绘制多次,从而使CPU或者GPU负载过重。
[5]View频繁的触发measure,layout,导致measure,layout累计耗时过多以及整个View频繁的重新渲染。
[6]内存频繁触发GC过多,导致暂时阻塞渲染操作。
[7]冗余资源以及逻辑等导致加载或执行缓慢。
[8]ANR(轻量版)。
3.解决方法
1.布局优化
尽量不存在布局冗余嵌套以及过于复杂的布局。如果有重用的布局使用include标签。< merge >标签是作为< include >标签的一种辅助扩展来使用的,它的主要作用是为了防止在引用布局文件时产生多余的布局嵌套。大家都知道,Android去解析和展示一个布局是需要消耗时间的,布局嵌套的越多,那么解析起来就越耗时,性能也就越差,因此我们在编写布局文件时应该让嵌套的层数越少越好。
http://blog.csdn.net/guolin_blog/article/details/43376527
2.列表及Adapter优化
使用View的重用机制。在列表滑动的时候,不要去加载资源,显示默认的资源或者图片的缩略图,在列表滑动结束的时候再加载。
3.背景和图片等内存分配的优化
尽量减少一些背景中不必要的设置,背景图片尽量进行压缩处理。
4.避免ANR
在主线程(UI线程)不要进行耗时操作。