先说一个总结:
呈现模式主要为四种,简单描述了一下特点:
- Immediate:无帧率限制、有撕裂。
- FIFO:最高帧率为设备刷新率、无撕裂、但图像有延迟。
- FIFORelaxed:最高帧率为设备刷新率,用一定程度的撕裂来解决FIFO延迟问题,低撕裂,低延迟。
- MailBox:最高帧率为设备刷新率,无撕裂、低延迟,但绘制的无用图像会多。
功能表更方便
模式 | 帧率限制 | 撕裂 | 延迟 | 功耗 |
Immediate | 无 | 高 | 无 | 高 |
FIFO | 垂直同步 | 无 | 高 | 低 |
FIFORelaxed | 非延迟下垂直同步 | 低 | 中 | 低 |
MailBox | 垂直同步 | 无 | 低 | 高 |
PC游戏首选MailBox次选Immediate模式,不关心绘制次数问题,只考虑能不能接受撕裂效果。移动端游戏首选FIFORelaxed次选FIFO,MailBox绘制的无用图像太多会导致额外的功耗,而FIFORelaxed能一定程度上解决FIFO存在的延迟问题。
Contents
垂直空白/垂直消隐
我们有一台60Hz刷新率的显示器,那么每张图像的刷新时间就是小于16.6ms。
带有电子枪等器件的旧显示器通过从左到右的画扫描线来呈现一行像素,然后在将电子枪从右移动到左边开始下一行,从右移动到左的这个期间就是水平空白或水平消隐(horizonal blank)。用类似的概念,图像的更新可以想象屏幕上的图像是从左上角一行一行的刷新到右下角,当数据传输达到了当前图像的末尾时,从右下角返回到左上角开始处的时间点被称为垂直空白,在这个时间点内旧的图像被呈现完,新的图像还没开始呈现,所以通常在这个时间点来做图像交换就可以避免旧图像呈现到一半新图像交换进来而导致的画面撕裂。
因此、在60Hz的显示器上,每秒就会出现60个垂直空白。
Immediate立即模式
在Immediate模式下,不会关注当前是否在垂直空白期间而直接交换呈现图像,如果当前有图像正在呈现,那么直接交换新图像就可能会出现上半是旧图像下半是新图像的撕裂的效果。在这种模式下可以无限制的获取图像进行绘制,并不管当前状态的直接交换图像,不会等待,所以无限制帧率。
FIFO先入先出模式
FIFO模式,先入先出模式,以队列中有两张图像(双重缓冲)举例,当A图像正在呈现,B图像已经绘制完成时,B图像不会直接交换当前呈现,而是等待A图像呈现完毕,出现垂直空白时交换图像。该模式因为根据垂直空白来交换图像,所以60hz的显示器只会有最多60个图像被呈现。
当绘制速度特别快,而呈现速度相对较慢的时候,会产生已经画完的图像在排队等待呈现完的垂直空白的情况,造成延迟。
而当绘制速度较慢,呈现速度较快的时候,则会出现图像已经呈现完毕进入垂直空白,但没有新的可用图像交换进来,而一旦过了垂直空白后才有图像进入可呈现状态,那么即使当前没有呈现的图像,那也只能在下一个垂直空白在交换了。FIFO不允许在垂直空白外交换呈现图像。
该模式在各种设备上得到了广泛支持。
FIFO-Relaxed先入先出模式宽松版
这个模式基本上与FIFO相同,只是在对于绘制速度慢而呈现速度快的情况下有着不一样的处理方式,绘制速度慢导致错过了垂直空白,过了该次垂直空白后绘制完毕进入可呈现状态,那么在该模式下不会在继续等待下一个垂直空白,而是即使造成撕裂也会进行图像交换。
可以理解为如果绘制结束时可以赶上垂直空白那就是FIFO,如果已经过了垂直空白那本次就立即呈现,通过允许一定的撕裂来减少延迟。
MailBox邮箱模式
邮箱模式,与FIFO的先入先出队列有很大不同,准备呈现区的图像(邮箱)只能有一张,以ABC三张图举例,A正在呈现中,B已经绘制完毕在准备呈现区等待垂直空白的到来,C正在绘制。当C绘制完毕并且A还没有呈现完毕时,C的图像要比当前准备呈现的B图像更新,所以C会替换掉邮箱内的B图像成为待呈现图像。而B图像因过时而被放弃,回炉重造绘制新图像,这么做可以有效的降低FIFO队列存在的延迟,同时只在垂直空白期间交换不会存在撕裂问题。但该模式下可能会绘制许多无用图像,这些图像因为过时而无法被呈现,但是却实实在在的导致额外的功耗,这在一些对功耗较敏感的硬件平台并不合适。