可以先了解下重翻已生灰的Android书---View绘制流程及原理
Android是16ms刷新一次屏幕,它是怎么刷新的??
在ViewRootImpl ---> requestLayout()发起UI重绘 --> scheduleTraversals()
image.png
什么时候置为false??
在mTraversalRunnable,这个Runnable线程是接收到Vsync信号,才会执行doTraversal()
image.png
Vsync主要的执行方法是在Choreographer中,FrameDisplayEventReceiver的onVsync方法
image.png
参数timestampNanos是Vsync信号的时间戳,这是用来计算耗时,也就是为什么会出现丢帧。
image.png
image.png
丢帧的原因:主线程做耗时操作,根本原因是Vysnc信号的接收,和View的重绘,调用onDraw方法时机啥的都没关系。
View调用onDraw方法,不会立即执行,必须要接收到Vysnc信号,每隔16ms刷新屏幕,即使View没有被重绘,还是会每隔16ms刷新,只不过刷新的都是旧的同一个数据。
个人总结:屏幕刷新主要在Choreographer中调用的Vsync信号的接收。
网友评论