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信号到达,将上面计算好的数据渲染到屏幕上,同时如果有必要开始下一帧的数据处理

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...