最近无意中翻到一篇文章,讲述的是屏幕图像显示原理,以前我并不太关心这方面的理论,认为这仅仅是关乎于硬件的层面,对于我这种软件开发方面用处并不大。百无聊赖之下看了此篇文章后,收获不小。在这里为了温故而知新,浅谈一下我认为对自己比较重要的知识点。
屏幕显示图像的原理:从过去的CRT到现在的液晶显示器,成像的原理是一样的。
(请原谅我盗个图,嘿嘿...)
看上图一目了然的能够大致看出成像的原理。成像的核心就是GPU为主导的,首先CPU计算好屏幕要显示的内容,将它提交给GPU,GPU开始渲染后将结果放入到帧缓冲区,随后视频控制器读取帧缓冲区的数据经过转换后传递过显示器显示。
画面撕裂的现象:但是GPU的渲染完成一个新的图像帧时,此时屏幕显示器只完成了上一帧的部分图像时,此时GPU刷新帧缓冲区时,这时就会出现画面撕裂的现象了。为了解决这个问题,GPU 通常有一个机制叫做垂直同步(简写也是 V-Sync),当开启垂直同步后,GPU 会等待显示器的 VSync 信号发出后,才进行新的一帧渲染和缓冲区更新。这样能解决画面撕裂现象,也增加了画面流畅度,但需要消费更多的计算资源,也会带来部分延迟。这里我困惑了,帧缓冲区难道只能放一帧的图像?为此我查了一下帧缓冲区的定义:帧缓冲存储器(Frame Buffer):简称帧缓存或[显存],它是屏幕所显示画面的一个直接映象,又称为位映射图(Bit Map)或光栅。帧缓存的每一[存储单元]对应屏幕上的一个像素,整个帧缓存对应一帧图像。
卡顿产生的原因:看图说话(再盗一下图)
此图更为形象的反映了屏幕成像的原理流程是怎么样的。CPU计算显示内容,例如视图创建,布局计算、图片解码、文本绘制等。随后 CPU 会将计算好的内容提交到 GPU进行合成、渲染。随后 GPU 会把渲染结果提交到帧缓冲区去,等待VSync 信号到来时显示到屏幕上。如果此时下一个VSync 信号到来时,CPU或GPU都没有完成相应的工作时,则那一帧将会丢失,则就是我们看到屏幕卡顿的原因。
所以说,卡顿造成的原因通常是CPU和GPU导致的掉帧引起的,那么我们在编码的同时就会从这两方面去思考问题所在。