一、绘制优化
Android应用启动慢,经常卡顿,按照场景分可分为两大类:
页面绘制:
主要原因是绘制的层级深,页面复杂,刷新不合理。大多数场景是页面初始化或者页面跳转。
数据处理:
主要原因是数据处理量太大,一般分为三种情况:
数据处理在UI线程;数据处理占用CPU高;内存增加导致GC频繁。
Android的显示过程可以简单概括为:应用层把经过测量、布局、绘制后的surface缓存数据,通过SurfaceFlinger把数据显示到屏幕上。应用层负责绘制,系统层负责渲染,通过进程间通信把应用层需要绘制的数据传递到系统层。
应用层:
Measure:使用深度优先原则递归得到所有视图的宽高;
Layout:使用深度优先原则递归得到所有视图的位置;
Draw:支持两种绘制:软件绘制(CPU)和硬件加速(GPU)
系统层:
Android显示系统使用了匿名共享内存:
SharedClient,每个应用和SurfaceFlinger之间都会创建一个SharedClient,最多可以创建31个SharedBufferStack集合,每个Surface都对应一个SharedBufferStack,也就是一个Window。
应用层绘制到缓存区,SurfaceFlinger把缓存区数据渲染到屏幕,由于两个进程都使用了Android的匿名共享内存SharedClient。
绘制过程是CPU准备数据,通过Driver层把数据交给CPU渲染,其中CPU主要负责Measure,Layout,Record,Execute的数据计算工作,GPU负责Rasterization渲染。
卡顿的根本原因:
绘制任务太重,绘制一帧内容耗时太长。主线程太忙了,导致VSync信号来时还没有准备好数据,导致丢帧。
主线称要做的工作:
UI生命周期控制,
系统事件处理
消息处理
页面布局
页面绘制
页面刷新
绘