Android使用的绘制引擎是Skia,而App中的动画、2D绘制、SVG矢量图都是通过该绘制引擎进行绘制,并且通过显卡输出到渲染的Buffer中,用户才能看到绘制的图形。
而在Android中,一个View绘制的过程如下:
epoll
将V_SYNC
信号回调给应用进行绘制,而该信号一般都是1s绘制60帧,也就是16.6ms左右回调一次所以,我们应该在两个V_SYNC
信号间处理事件不超过16ms。也就是我们需要保证:
正常情况: 每隔16ms开始绘制下一帧
正常情况
异常情况: 当一帧绘制开始的时间间隔超过16ms的话,那么VSYNC机制就会让GPU等待下一个Buffer到来再完成栅格化、渲染等操作,就会导致掉帧,用户看起来就会卡顿
异常情况
在Profiler中Record一段时间后,Android Profiler会开始打印出来这段时间内的所有线程以及线程内栈帧的调用时间等。
Profiler-CPU
在上面的截图中,可以看到:
doFrame
函数一共执行了8.57ms,在执行完该函数后,MessageQueue继续陷入epoll中等待下一个事件来到。
而后又接收到了一个doFrame
的事件,要求绘制。
而如果某个doFrame
中时间超过16.6ms,或者两个doFrame
之间的间隔超过16.6ms,则会导致丢帧,所以我们需要优化的也就是这些代码。