周二好呀,今天给你们带来一点轻松简单的内容,没有代码,请享用~html
指的是屏幕的刷新频率
,也就是一秒内屏幕刷新的次数。刷新频率这个参数是手机出厂就决定的,取决于硬件的固定参数。android
高刷手机
,通常就是指高刷新率屏幕,也就是大于通常的60hz,好比90hz,120hz
等等。它的特色就在于每秒刷新的频率更高,使得画面更加流畅,顺滑
,就算出现丢帧等状况,画面还能保证一个稳定性。面试
屏幕的刷新过程是每一行从左到右,从上到下,顺序显示像素点。当整个屏幕刷新完毕,即一个垂直刷新周期完成,会有短暂的空白期,此时发出 VSync
信号。若是是60hz的手机,那么每次屏幕刷新的过程占用时间就是16ms(1000/60)
左右。缓存
通常一个图形界面的绘制,须要CPU
准备数据,而后GP
U进行绘制,绘制完写入缓存区
,而后屏幕按照刷新频率来从这个缓存区中取图形显示。app
因此整个刷新过程是CPU,GPU,屏幕(Display)
三方合做的工做关系。布局
帧率
,就是GPU
一秒内绘制操做的帧数,单位是fps
。游戏中比较常见,越大也就表明越流畅。因此这个参数并非固定值,可是若是屏幕刷新频率是60hz
,你的帧率大于60fps
也就浪费了,因此通常状况下最好是帧率和屏幕刷新频率保持一致,即一样是60fps
。这样就能保证一个比较平滑的视觉动画。post
VSync
,垂直同步,在Android4.1
引进,是一种定时发送绘制信号的机制,它的做用就是让帧率和屏幕刷新率保持一致,防止跳帧卡顿等等。玩过lol的朋友应该都知道,设置界面就能够开启垂直同步选项。学习
正常若是没有开启vsync
,屏幕刷新有可能会出现什么问题呢?动画
如图,因为CPU,GPU
绘制图像的时间不定,因此就有可能会发生卡顿状况,也就是下一帧的数据没准备好,没法正常显示到屏幕上。ui
若是咱们开启vsync
,也就是给CPU和GPU
规定了开始绘制帧数据的时间。开启后,系统会每16ms就发送一次vsync信号,CPU
收到信号就开始处理数据,而后GPU绘制图像。这样就把16ms最大化的利用起来了,只要CPU和GPU
在16ms
以内把下一帧数据处理好,那么屏幕就能从缓存区中拿到下一帧数据并显示出来了。如图:
因此vsync
信号就是为了保证16ms
绘制出一帧的数据出来。使得屏幕每16ms刷新一次,就能用到最新的帧数据了。这样画面就是比较流畅的了。
这整个过程其实就在Choreographer
类中实现的,包括同步屏障的使用也在其中,下次会具体讲到。
单缓存
。就是CPU
计算好的数据交给GPU
,而后GPU
进行图像绘制,最后放到缓存区
。而屏幕就直接从这个缓存区
中拿到数据并显示。可是这样作有个问题就是,由于Display和GPU
都是操做的同一个缓存,就会出现同一个画面中有不一样帧的数据。好比屏幕刷新的时候,第二帧还没绘制完,那么缓存中就有第二帧数据还有第一帧残留的数据,这样显示出来的画面就有两个帧
的画面了,好比画面撕裂
。
双缓存
。这个双缓存就是设计出来解决单缓存问题的。既然Display和GPU
不能共用一个缓存,那么就设计两个缓存就能够啦。FrameBuffer
来作显示输出,也就是屏幕每次从这个缓存中取图形数据。BackBuffer
用来放下一帧的画面,也就是CPU每次绘制数据到这个缓存中。而后当CPU完整绘制完下一帧图形,也就是BackBuffer
准备好,屏幕也显示完上一帧数据的时候,就进行缓存交换,把数据同步到FrameBuffer
。而这个缓存交换点,就是vsync信号时刻。
三缓存
。 Android4.1 引入,通常来讲,双缓存就可以使用了,可是为何还有一个三缓存呢?看图:双缓存状况下,若是CPU/GPU
处理数据过慢,就会发生上图的状况。也就是vsync
信号来的时候,上一帧数据还没绘制完,因而A数据图片显示了两帧的时间,并且因为vsync来的时候cpu才开始处理数据,而图上vsync
来的时候,GPU
还在处理数据,致使GPU
处理完了以后,没法触发下一帧数据的处理,浪费了一大半时间。后面状况相似,只要CPU/GPU
处理数据过慢,就会发生Jank(卡顿等问题)
因此这时候就引入了第三个缓存,如图:
如图所示,在vsync
来的时候,若是GPU
还没处理好数据帧B的图形,这时候第三个缓存区能够来处理后面C帧的数据,而后第二个vsync信号来的时候,虽然第三缓存区还在用做处理C帧数据,可是以前的BackBuffer
又能够来缓存下一帧的数据了。
这样一来,虽然A帧数据仍是显示了两个时间点,可是后面因为有新Buffer
的加入,能够保证后续图像显示能正常平滑的显示了。就至关于多了一个劳动力,能够最大限度利用好时间。
当咱们用代码修改了UI,好比使用了setText
,修改Textview
的值。这时候屏幕不会立刻绘制刷新。而是会调用到invalidate
方法请求重绘,而后会向VSYNC服务
发送请求,等到下一个VSYNC
信号触发的时候,就开始上面说过的流程,也就是处理数据,绘制图像,具体所作的工做就是测量—布局—绘制
。接着,屏幕就能够拿到缓存区中绘制好的图像并显示到屏幕上了。
因此任何UI的改变,都要听从上述所说的VSYNC
机制,只是这个过程很短。固然为了保证最快时间绘制到屏幕上,而不让其余消息影响到VSYNC
的响应速度,就加入了同步屏障。
首先,屏幕刷新频率这个是不会变
的,也就是每隔16ms
左右就会进行一次刷新,而刷新的帧数据就是咱们的程序内部在接收到刷新的vsync
信号以后,通过计算绘制后的图像数据。
可是,app并非每个vsync
信号都能接收到的,只有当应用有绘制需求的时候,才会经过scheduledVsync
方法申请VSYNC
信号,而后下一个屏幕刷新的信号才能被咱们的程序所接收到,也就是Choreographer
类的onVsync
方法才能被执行,而后就开始测量—布局—绘制
等工做了。
因此,若是界面不变化,咱们的程序就收不到VSYNC信号
,也就没法处理数据进行绘制了。只有当须要改变界面的时候,才会去申请这个屏幕刷新服务,才能接收到VSYNC信号
。这种状况下,屏幕还会进行刷新,只不过刷新的都是一样
的图像数据。
https://juejin.cn/post/6863756420380196877
https://www.cnblogs.com/frrj/archive/2018/07/30/brief-info-of-android-display.html
https://www.jianshu.com/p/10db590ed9a6
有一块儿学习的小伙伴能够关注下❤️ 个人公众号——码上积木,天天剖析一个知识点,咱们一块儿积累知识。公众号回复111可得到面试题《思考与解答》以往期刊。