1.android 渲染机制
安卓系统每16ms发出一个vsync信号来通知UI进行渲染,如果整个过程保证在16ms内完成就能达到一个流畅的效果,而如果超过16ms就会出现丢帧的情况,这时logcat控制台
也会打印类似dropframe的警告,绘制会在下一个16ms进行,即使就丢一帧,用户还是可以感觉到卡顿的。至于为什么是16ms,16ms其实就是1000ms/60fps,也就是1秒内要刷新60
帧,具体的概念百度好了,这里不多赘述,安卓选择60fps就是为了保证画面的足够流畅。
而卡顿的来源就是没有必要的layout、invalidation、Overdraw。渲染的过程是由CPU与GPU协作完成,通常通过两个工具来检测
通过Hierarchy Viewer(视图树查看)去检测渲染效率,去除不必要的层级嵌套。
通过Show GPU Overdraw去检测Overdraw(过度绘制),可以通过移除不必要的背景以及使用canvas.clipRect(绘制范围)解决大多数问题。
2. 2.1 Overdraw(过度绘制)的检测
看一款APP的质量,简单直接的方法就是查看其GPU过度绘制选项开启下的页面状况,首先打开手机的GPU过度绘制,对比一张色块图
颜色越深,出现绘制次数越多,这都是不必要的,也是需要优化的地方
这里写一个例子,一个Activity包含一个Listview,listview条目item里有一些文本、图片元素,先把它写成一个反例。检测绘制如下图
处理方法:2.1.1去掉不必要的background
一步步看效果,由于每个activity最终会添加在DecorView中,这个view有一个默认的背景,这个是我们不需要的,先把他去掉,看下效果
最后,背景尽可能保证只设置一次,无论是代码里设置还是布局文件里设置,重复设置就会引起性能降低。
2.1.2clipRect绘制范围使用
canvas.clipRect(0, 0, 80, mCards[i].getHeight());
canvas.drawBitmap(bitmap, 0, 0, null);
canvas.restore();
2.2 Hierarchy Viewer查看视图层级树