前言
Android系统的极致UI性能是60帧每秒,所以每帧处理的时间不能超过16ms。这是Android官方给出的流畅运行定义。
我们来看一下,一帧需要处理多少数据。
我手头有个1920x1080的pad,60帧的情况下,一秒的像素量就是1920x1080x60。
设置个1920x1080的背景,
转换成内存
Bitmap.Config ARGB_4444:每个像素占四位,即A=4,R=4,G=4,B=4,那么一个像素点占4+4+4+4=16位 ---->1920x1080x60x16/8 = 237.3M
Bitmap.Config ARGB_8888:每个像素占四位,即A=8,R=8,G=8,B=8,那么一个像素点占8+8+8+8=32位 ---->1920x1080x60x32/8 = 474.6M
Bitmap.Config RGB_565:每个像素占四位,即R=5,G=6,B=5,没有透明度,那么一个像素点占5+6+5=16位 ---->1920x1080x60x16/8 = 237.3M
Bitmap.Config ALPHA_8:每个像素占四位,只有透明度,没有颜色。 ---->1920x1080x60x4/8 = 59.3M
看着都觉得多
简单分析
UI卡顿的原因主要是以下几类
1.UI线程有耗时或轻微耗时操作
2.Layout过于复杂
3.View过度绘制---单位时间内,动画执行次数太多,加重CPU GPU负担
4.View频繁measure layout,增加渲染次数
5.内存GC,阻塞渲染
6.冗余资源,渣渣逻辑-----加载执行慢
7.ANR
分析工具
针对1、2、4可以用hierarchyviewer.bat和lint过冗余
在SDK目录下..\adt-bundle-windows-x86_64-20140702\sdk\tools\hierarchyviewer.bat
针对3,可以用DDMS查看Heap或者adb shell dumpsys cpuinfo 或者adb shell top -m 1
针对5,可以用内存监控,leakCanary blockCanary或者DDMS里头的Allocation Tracker。主要是找一下内存抖动。工具是挺多的,还有腾讯的WeTest。