微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android的UI刷新机制Android屏幕刷新机制

文章目录

一、相关知识科普:

  • 显示系统中一般包括cpu、GPU、display三个部分,cpu一般负责计算数据,然后把计算好的数据交给GPU,GPU会对这些图形数据进行渲染,渲染后放在buffer里面存起来,最后display负责将buffer里的数据呈现到显示器中
  • Android的刷新频率是60帧/秒,Android系统中每隔16.6ms会发送一次VSYNC(同步)信号,有可能会触发UI的渲染

二、流程:

  • (1)界面上任何一个View的刷新请求最终都会走到ViewRootImpl#scheduleTraversals()里来安排一次遍历绘制View树的任务
  • (2)首先,scheduleTraversals()会先过滤掉同一帧内的重复调用,确保同一帧内只需要安排一次遍历绘制View树的任务,遍历过程中会将所有需要刷新的View进行重绘
  • (3)然后,scheduleTraversals()会往主线程的消息队列中发送一个同步屏障拦截这个时刻之后所有的同步消息的执行,但不会拦截异步消息,以此来尽可能的保证当接收到屏幕刷新信号时可以第一时间处理遍历绘制View树的工作
  • (4)发完同步屏障后,scheduleTraversals()将performTraversals()封装到Runnable里面,然后调用Choreographer#postCallback()方法
  • (5)postCallback()方法会先将这个Runnable任务以当前时间戳放进一个待执行的队列里,然后如果当前是在主线程就会直接调用一个native层方法,如果不是在主线程,会发一个最高优先级的message到主线程,让主线程第一时间调用这个native层的方法
  • (6)native层的这个方法是用来向底层订阅一个屏幕刷新信号Vsync,当下一个屏幕刷新信号发出时,底层就会回调Choreographer#onVsync()方法通知上层app
  • (7)onVsync()方法被回调时,会往主线程的消息队列中发送一个执行doFrame()方法的异步消息
  • (8)doFrame()方法会去取出之前放进待执行队列里的任务来执行,取出来的这个任务实际上是ViewRootImpl#doTraversal()在操作
  • (9)doTraversal()中首先会移除同步屏障,再调用performTraversals()方法,根据当前状态判断是否需要执行performMeasure()测量、perfromLayout()布局、performDraw()绘制流程,在这几个流程中都会去遍历View树来刷新需要更新的View
  • (10)等到下一个Vsync信号到达,将上面计算好的数据渲染到屏幕上,同时如果有必要开始下一帧的数据处理

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐