背景知识:
在一个比较典型的显示系统中,一般主要包括CPU,GPU,display三个部分,CPU负责计算帧数据,把计算好的数据交给GPU,GPU会对图像数据进行渲染,然后把渲染后的数据放到buffer(图形缓存区),SF会从图形缓冲区中取出这些buffer,放入到layer中,然后合成一帧的数据(帧缓冲区),最后display(屏幕或显示器)会从帧缓冲区中取出这些数据展示到屏幕上。
一、基础概念:
1、屏幕刷新频率:一秒内屏幕刷新的次数(一秒内显示多少帧图像),单位是HZ,比如我们的手机有60HZ,1000ms / 60 = 16.6ms,16.6ms屏幕会刷新一次
2、逐行扫描:显示器将绘制好的buffer展示到屏幕上,是从左到右,从上到下逐行扫描,按顺序显示整屏的一个个像素点,只是这个过程很快
3、帧率(Frame rate):GPU在一秒内可以绘制多少帧图像
二、画面撕裂:
当一个屏幕的数据来自两帧的数据,画面会出现撕裂,类似于断层,如下图
画面撕裂的原因:
屏幕刷新的时间是固定的,即每过16.6ms会从帧缓冲区中取出一帧图像来显示,理想情况下帧率和刷新屏幕保持一致,每绘制完一帧,显示器显示一帧。但是CPU/GPU写数据是不可控的,所以会出现buffer里面有些数据还没被显示出来就被重写了。屏幕刷新时,它并不知道此时buffer的状态,因此从buffer里面取的帧数据并不是完整的一帧画面,简单来说就是display在显示的过程中,buffer内的收据被CPU/GPU修改,导致画面撕裂。
三、双缓存
解决画面撕裂的方法就是双缓存,上面出现画面撕裂的原因是显示过程中,一帧内的buffer数据被重写,这里使用两个buffer,绘制一个buffer(back buffer),显示一个buffer(frame buffer)。GPU绘制好一帧图像之后放入back buffer,当back buffer数据被绘制好之后,才和frame buffer交换,display取出frame buffer的数据来显示的时候,frame buffer是不会发生变化的,因此就不会发生画面撕裂了。
四、vsync
这里又有个问题,啥时候两个buffer进行交换?
假如back buffer准备好之后就准备交换,但此时屏幕还没有完整显示上一帧的图像的话,就会发生问题了。所以需要等屏幕把frame buffer里面的数据全部显示完成之后,才能进行buffer交换了。
当扫描完一个屏幕之后,设备需要重新回到第一行以进行下一次的循环,此时有一段空闲期,称为VBI,这个时间点就是buffer交换的最佳时间点,此时屏幕没有在刷新,也避免出现撕裂。
Vsync(垂直同步)是verticalsynchronization的简写,利用VBI时期出现的vertical sync pulse(垂直同步脉冲)保证双缓冲在最佳时间点才进行交换,交换是指各自的内存地址。
下面总结了一下整个显示流程的一个流程图,主要是activity冷启动到第一帧画面显示出来的过程,后面也主要沿着这个流程深入学习
(梳理流程中可能会有不少的地方讲的不清楚或者有问题,毕竟还是个弟弟,哈哈)