垂直信号vsync

小手动一动,点赞转发加关注。微信搜索【大前端杂货铺】公众号关注大前端老司机带您遨游大前端知识的海洋。关注 Github https://github.com/big-frontend 还有大前端代码实践哦。

为了描述方便这里默认系统的刷新率为60hz。

为了提高Android的UI流畅性,Android团队采用了vsync+三buffer。其中处理vsync的Choreographer这个类,其类主要是用来监听vsync和调度vsync。那么vsync能带来什么?vsync能解决屏幕撕裂、跳帧、视觉伪影(抖动)的问题,能帮助屏幕(刷新率eg.60Hz)和应用(GPU 帧率 60fps or 60hz)实现帧同步。

Choreographer每次post一个回调,都会调用DisplayEventReceiver#scheduleVsync向底层发送需要vsync的通知。屏幕的刷新率为60hz,在接受到vsync这个信号之后会处理一下事情然后通知Choreographer,Choreographer会主线程doFrame这一帧,在下一次vsync来临之前得提前将frame写入buffer供屏幕使用,在这一帧里面会通知UI有四种类型的需要回调。这一帧必须要在16ms处理完不然就会出现掉帧。其实如果帧率一直是50fps这样稳定还看不出掉帧,比较明显的掉帧是帧率不稳定,一会50fps一会60fps再一会40fps掉帧的感觉就会比较明显。

这里要说一下一帧的消耗怎么算?MessageQueue每次接受到一条message就会触发主线程Handler#dispatchMessage(handleCallback,handleMessage),从而完成一次ui更新。其中处理一条message消费的时间即为一帧的消耗。其实还有一种计算一帧耗时的方法,每次在FrameCallback#doFrame方法快结束时就再Choreographer#postFrameCallback一个FrameCallback,然后计算两次的时间差。对帧率监控有兴趣的可以看看这些项目:matrix、ArgusAPM

# size 为4,其类型为如下
# 1.输入事件callback
# 2.动画callback
# 3.递归view树callback,处理layout 和draw
# 4.提交callback,处理post-draw的操作
# 执行顺序也是从数组头部到尾部。
CallbackQueue[] mCallbackQueues

CallbackQueue将CallbackRecord对象遵循时间递增顺序入队,队头总是被先消费,而其方法extractDueCallbacksLocked就是获取现在时间之前的CallbackRecord链表,及时处理回调链。

每个线程拿到的Choreographer对象都是互不影响(ThreadLocal),那么也就意味着,事件线程、动画线程(InvalidateOnAnimationRunnable),ui测绘线程都有一个Choreographer,最后都会在主线程doFrame处理这一帧

小手动一动,点赞转发加关注。微信搜索【大前端杂货铺】公众号关注大前端老司机带您遨游大前端知识的海洋。关注 Github https://github.com/big-frontend 还有大前端代码实践哦。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值