Android UI渲染优化
1. 过度绘制优化
什么是过度绘制?
Overdraw(过度绘制)描述的是屏幕上的某个像素在同一帧的时间内被绘制了多次。在多层次重叠的UI结构里面,如果不可见的UI也在做绘制的操作,会导致某些像素区域被绘制了多次。这样就会浪费大量的CPU以及GPU资源。
从开发者选项可以设置看到过度绘制区域,红色是过度绘制最严重的区域。
优化方式:
1. 移除布局中多余的背景
2. 减少层级嵌套,使用约束布局
3. 减少透明度使用
自定义view onDraw造成的过度渲染,可以使用canvas.clipRect方法,来对canvas进行裁剪。或者使用canvas.quickReject.
2.其他UI优化
多使用padding代替margin
使用merge 可以减少层级结构。
使用ViewStub,延迟加载,不必须时候不加载
尽量少使用bitmap,多使用shape之类
16ms的问题
主流的刷新频率是60次/秒,折算出来就是16ms刷新一次。如果大于这个时间,人眼就会感觉到卡顿。但是16ms不是draw的时间,实际上留给draw的时间比这个要少一些,对于自定义view,onDraw的执行时长要尽量很少。
请注意:任何时候View中的绘制内容发生变化时,都会需要重新创建DisplayList,渲染DisplayList,更新到屏幕上等一系列操作。这个流程的表现性能取决于你的View的复杂程度,View的状态变化以及渲染管道的执行性能。举个例子,假设某个Button的大小需要增大到目前的两倍,在增大Button大小之前,需要通过父View重新计算并摆放其他子View的位置。修改View的大小会触发整个HierarcyView的重新计算大小的操作。如果是修改View的位置则会触发HierarchView重新计算其他View的位置。如果布局很复杂,这就会很容易导致严重的性能问题。
使用矢量图代替jpg, png