Android性能优化三个方面
Android的渲染机制,
内存与GC,
电量优化
1.Android渲染机制
垂直同步
Android系统每隔16ms发出VSYNC信号,触发对UI进行渲染,如果每次渲染都成功,这样就能达到流畅的画面所需要的60fps,这意味着程序的大多数操作都要在16ms内完成.
如果你的某个操作花费的时间是24ms,系统在得到VSYNC信号的时候无法进行正常渲染,这样就发生了丢帧现象,那么用户在32ms内看到的就是同一副画面
用户很容易在UI执行动画或者滑动ListView的时候感知到卡顿不流畅,是因为这里的操作相对复杂,容易发生丢帧现象,从而感觉卡顿,有很多原因可以导致丢帧,
也许是因为你的Layout太过复杂,无法再16ms内完成绘制,也有可能是因为你的UI上有太多的绘制单元,还有可能是动画执行的次数过多,这些都会导致CPU或者GPU负担过重
为了理解APP是怎样进行渲染的,我们必须了解手机硬件是如何工作的,那么就必须理解什么是VSYNC,
在讲解VSYNC之前我们需要理解两个相关概念,
- Refresh Rate:代表屏幕在1s内刷新的次数,这取决于硬件的固定参数,例如60HZ;
- Frame Rate:代表GPU在1s内绘制操作的帧数,例如30fps,60fps
GPU会获取图形进行渲染,然后硬件负责把渲染后的内容呈现到屏幕上,他们两者不停地协作,不幸的是,刷新频率
和帧率并不是总能保持相同的节奏,如果发生帧率与刷新频率不一致的情况,就会容易出现Tearing的现象(画面上下两部分显示内容发生断裂,来自不同的两帧数据发生重叠)。
通常来说,帧率超过刷新频率只是一种理想的状况,在超过60fps的情况下,GPU所产生的帧数据会因为等待VSYNC的刷新信息而被Hold住,这样能够保持每次刷新都有实际的新的数据可以显示。但是我们遇到更多的情况是帧率小于刷新频率。在这种情况下,某些帧显示的画面内容就会与上一帧的画面相同。糟糕的事情是,帧率从超过60fps突然掉到60fps以下,这样就会发生LAG,JANK,HITCHING等卡顿掉帧的不顺滑的情况。这也是用户感受不好的原因所在
过度绘制(overDraw)
OverDraw描述的是屏幕上的某个像素在同一帧的时间内被绘制了很多次,在多层次的UI结构里面,如果不可见
的UI也在做绘制的操作,这就会导致某些像素区域被绘制了多次,这就浪费大量的GPU和CPU资源
当设计上追求更华丽的效果的时候,我们容易陷入采用越来越多的层叠组件来实现这种视觉效果的怪圈,这很容易导致大量的性能问题,
为了获得最佳的性能,我们必须尽量少让OverDraw的情况发生
为什么60fps为流畅
我们通常都会提到60fps与16ms,可是知道为何会是以程序是否达到60fps来作为App性能的衡量标准吗?这是因为人眼与大脑之间的协作无法感知超过60fps的画面更新。
12fps大概类似手动快速翻动书籍的帧率,这明显是可以感知到不够顺滑的。24fps使得人眼感知的是连续线性的运动,这其实是归功于运动模糊的效果。24fps是电影胶圈通常使用的帧率,因为这个帧率已经足够支撑大部分电影画面需要表达的内容,同时能够最大的减少费用支出。但是低于30fps是无法顺畅表现绚丽的画面内容的,此时就需要用到60fps来达到想要的效果,当然超过60fps是没有必要的。
开发app的性能目标就是保持60fps,这意味着每一帧你只有16ms=1000/60的时间来处理所有的任务。