XML布局显示到屏幕流程
Android系统每隔16ms发出VSYNC信号,触发对UI进行渲染,如果每次渲染都成功,这样子就能够达到流程的画面所需要的60fps,为了能够欧实现60fps,这意味着渲染的大多数操作都必须在16ms内完成。
卡顿原理
当这一帧画面渲染时间超过16ms的时候,垂直同步机制会让显示器硬件等待GPU完成栅格化悬案,这样会让这一帧画面多停留了16ms,甚至更多,这样就造成了用户看起来画面停顿。
如何减少时间
1、CPU减少XML转换成对象
2、GPU减少重复绘制
过度绘制
布局层级太深,用户看不到区域也会被绘制
if(chat.getAuthor().getAvatarId()==0){
Picasso.with(getContext()).load(android.R.color.transparent).into(chat_author_avatar);
chat_author_avatar.setBackgroundColor(chat.getAuthor().getColor())
}else{
Picasso.with(getContext()).load(chat.getAuthor().getAvatarId()).into(chat_author_avatar);
chat_author_avatar.setBackgroundColor(Color.TRANSPARENT)
}
//Picasso使用的是src,会导致重复绘制
// if(chat.getAuthor().getAvatarId()!=0){
// Picasso.with(getContext()).load(chat.getAuthor().getAvatarId()).into(chat_author_avatar);
// }
// chat_author_avatar.setBackgroundColor(chat.getAuthor().getColor())
2、自定义控件中,onDraw方法做了过多的绘制
流程优化:
1、裁剪图片,涉及到计算,就会好性能,视觉欺骗(需要剪裁的地方,在上面覆盖一张中间透明,两边颜色和背景一样的图片)
2、app启动优化
总结
1、减少xml布局(原理:CPU在计算xml布局并且将图形交给GPU的这个过程必须在16ms内完成,所以需要通过减少布局层级的方式来减少计算时间)
2、GPU过度绘制(原理:GPU绘制时都是根据CPU指令还画,造成不必要的图层叠加,所以可以通过减少不必要的背景,重叠的部分可通过剪裁canvas的方式来进行优化)
3、内存抖动也会造成UI布局的卡顿(原理:当CG回收时,会暂停所有其他线程,包括UI线程)
(优化方式:肯定内存是有问题的,所以可以通过profile运行项目,检测内存是否存在抖动,如果有就去查询具体代码)