显示器系统
1. 显示器工作原理
当屏幕显示画面时,CRT的电子枪从上到下逐行扫描,扫描完成后显示器就呈现一帧画面。然后电子枪回到初始位置进行下一次扫描。
为了同步显示器的显示过程和系统的视频控制器,显示器会用硬件时钟产生一系列的定时信号。当电子枪换行进行扫描时,显示器会发出一个水平同步信号(horizonal synchronization),简称 HSync;而当一帧画面绘制完成后,电子枪回复到原位,准备画下一帧前,显示器会发出一个垂直同步信号(vertical synchronization),简称 VSync。显示器通常以固定频率进行刷新,这个刷新率就是 VSync 信号产生的频率。虽然现在的显示器基本都是液晶显示屏了,但其原理基本一致。
2. 显示器系统的组成
在计算机系统中, CPU、GPU、显示器以下图的方式协同工作。CPU 计算好显示内容提交到 GPU,GPU 渲染完成后将渲染结果放入帧缓冲区;视频控制器会则按固定的频率读取帧缓冲区的数据,经过数模转换传递给显示器显示。
3. 掉帧/卡顿问题
显示器以固定的频率(60Hz或者更高)刷新,而CPU和GPU计算和渲染的速度取决于当前这一帧画面计算的复杂度。当GPU不能及时地将渲染后的数据放入帧缓冲区,显示器就会重复显示同一帧的画面。这种情况称为掉帧或卡顿。
为了处理掉帧问题,通常会使用双帧缓冲区甚至三帧缓冲区。GPU会预先渲染好一帧放入一个帧缓冲区内,让视频控制器读取,当下一帧渲染好后,GPU会把视频控制器的指针指向第二个帧缓冲器,如此一来效率会有很大的提升。
但是掉帧的根本原因还是CPU/GPU渲染流水线过长,不会因为增加缓冲区而根本解决。
4. 画面撕裂问题
在双缓冲区的结构下,当显示器从帧缓冲区A读取数据扫描一帧画面,而GPU渲染好新的一帧数据放入帧缓冲区B中。如果视频控制器直接将指针指向帧缓冲区B,则会造成画面撕裂问题(上半截画面属于旧的一帧,下半截画面属于新的一帧)。
GPU的垂直同步机制能够很好的解决画面撕裂问题。当GPU开启垂直同步后,要等到显示器发出V-Sync信号才会进行下一帧的渲染和缓冲区更新。
但是引入垂直同步机制后,GPU要等到收到垂直同步信号,才会渲染下一帧。一定程度上拖慢了GPU渲染的速度。