面试复习题--绘制原理

1、屏幕刷新参与者

画笔 Skia : CPU 绘制 2D 图形;Open GL : GPU 绘制 2D / 3D 图形;
画纸 Surface : Android 4.4+ 应用程序都在 Surface 这张画纸上进行绘制和渲染。
画板 Graphic Buffer : 在屏幕刷新机制提到,Android 4.1+ 后有 3 块 Graphic Buffer 用于应用程序图形绘制,或 SurfaceFlinger 的合成和显示。
合成及显示 SurfaceFlinger : 合成所有图层并进行显示。(Surface 的投递者)

Android绘制流程 - 走看看

2、VSYNC垂直同步信号

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

3、SuerfaceView刷新原理

View通过刷新来重绘视图,Android系统通过发出VSYNC信号来进行屏幕的重绘,刷新的时间间隔为16ms​​​​​​​。​​​​​​​在一些需要频繁刷新,执行很多逻辑操作的时候,超过了16ms,就会导致卡顿。

SurfaceView继承之View,但拥有独立的绘制表面,即它不与其宿主窗口共享同一个绘图表面,可以单独在一个线程进行绘制,并不会占用主线程的资源。这样,绘制就会比较高效,游戏,视频播放,还有最近热门的直播,都可以用SurfaceView。SurfaceView有两个子类GLSurfaceViewVideoView

SurfaceViewView的区别:

  1. View主要适用于主动更新的情况下,而SurfaceView主要适用于被动更新,例如频繁地刷新
  2. View在主线程中对画面进行刷新,而SurfaceView通常会通过一个子线程来进行页面的刷新
  3. View在绘图时没有使用双缓冲机制,而SufaceView在底层实现机制中就已经实现了双缓冲机制。

你可能感兴趣的:(android,framework知识点,面试,android,面试,优化)