OpenGL(3)——图像撕裂及视频掉帧

1.⾼级光栅扫描显示系统结构

我们已计算机显示一张图片为例,首先由CPU解码到内存里,然后将解码数据从内存拷贝到显存中,后续处理将在显卡中进行,不在受限于系统总线。

GPU渲染->存到帧缓存区->视频控制器->读取帧缓冲区信息(位图)->数模转化(数字信号->模拟信号)->显示(逐行扫描)

1.屏幕卡顿原因

在完美的情况下,屏幕每次刷新时,都能从帧缓冲区读取完整的数据,显示在屏幕上。但是有时会出现如下图的撕裂情况,那这是怎么造成的呢?

如下图,屏幕是逐行扫描显示内容的,从帧缓冲区不断的读取数据,然后按顺序显示在屏幕上。

这时候如果屏幕扫描到一半的时候,帧缓冲区数据发生了更新,这时后续读取数据为新的数据。就会造成如上图的撕裂情况。

3.垂直同步与缓冲区

3.1垂直同步

垂直同步,相当于加锁。当一帧画面绘制完成后,显示器会发出一个垂直同步信号(vertical synchronization),简称 VSync,只是才开始下一帧的绘制。

3.2双缓冲区

为了解决效率问题,GPU 通常会引入两个缓冲区,即双缓冲机制。在这种情况下,GPU 会预先渲染一帧放入一个缓冲区中,用于视频控制器的读取。当下一帧渲染完毕后,GPU 会直接把视频控制器的指针指向第二个缓冲器。

3.3 掉帧

垂直同步+双缓冲区,虽然能解决图像撕裂问题,但会引入新的问题——掉帧。在接收到垂直同步信号的时候,CPU和GPU可能还没有将处理处理完成,这样就视频控制器就拿不到最新的数据,只能显示旧的缓冲数据。造成掉帧(重复渲染同一帧数据)。如下如所示,当VSync来临时,B还没处理好,只能继续显示A。

3.4 三缓冲区

使⽤了双缓冲区和垂直同步技术之后,由于总是要等待缓冲区交换之后再进行下⼀帧的渲染,使得帧率无法完全达到硬件允许的最⾼水平。为了解决这个问题,引⼊了三缓冲区技术,在等待垂直同步时,来回交替渲染两个离屏的缓冲区,⽽垂直同步发⽣时,屏幕缓冲区和最近渲染完成的离屏缓冲区交换,实 现充分利⽤硬件性能的目的。

注意,三缓冲区也不能完全解决掉帧的情况,只能是减少掉帧的情况

以上是 OpenGL(3)——图像撕裂及视频掉帧 的全部内容, 来源链接: utcz.com/a/30073.html

回到顶部