美文网首页OpenGL & Metal
视频撕裂及掉帧的原因

视频撕裂及掉帧的原因

作者: 黑眼豆豆_ | 来源:发表于2020-07-06 17:58 被阅读0次

    显卡

    显卡(英语:Video cardDisplay cardGraphics cardVideo adapter),是个人计算机最基本组成部分之一,用途是将计算机系统所需要的显示信息进行转换驱动显示器,并向显示器提供逐行或隔行扫描信号,控制显示器的正确显示,是连接显示器和个人计算机主板的重要组件,是“人机”的重要设备之一,其内置的并行计算能力现阶段也用于深度学习等运算。

    显卡的构成

    • GPU,是一种专门在个人电脑工作站、游戏机和一些移动设备(如平板电脑智能手机等)上做图像和图形相关运算工作的微处理器。(来自百度百科的解释)

      GPU.jpg
    • 显存,也称帧缓冲区,如果内存一样,它的作用是用来存储显卡处理过或者即将提取的渲染数据。

    • 显卡bios板,类似于主板。

    图形成像的原理

    图形成像流程.png
    • 数据经过计算以及处理后传输给地址总线。

    • GPU从地址总线中拿到数据,并进行处理及渲染,完成后将数据存入帧缓冲区(FrameBuffer)

    • 视频控制器从帧缓冲区中拿到数据(位图),并进行数模转换,并进行显示。


      image.png
    • 上图就是图像扫描的过程,将图像转化为一系列像素点的排列然后打印在屏幕上,然后逐行扫描。

    屏幕撕裂

    当然,这是一个正常的流程,但是事事都不可能完美,接下来,我们看看出现的问题。


    画面撕裂.jpg

    上图的景象想必大家都见过吧,图像出现错误。

    原因

    这是由于显卡输出帧的速度比显示器快,显示器的处理速度跟不上显卡。


    image.png

    如图,当旧的数据通过帧缓冲区读取到屏幕上,进行逐行扫描,当扫描到A点时,新的数据又传进来了,但是此时旧的数据并没有扫描完,新的数据就开始扫描了。所以会出现上半部分展示旧的数据,下半部分展示新的数据,从而造成屏幕撕裂。

    苹果的解决办法

    垂直同步(Vsync) + 双缓冲区(Double Buffering)

    • 双缓冲区(Double Buffering)分为前缓冲区后缓冲区。显卡只会将绘制完的图像写入后缓冲区,与此同时只有前缓冲区中的图像会被发送给显示器。当后缓冲区存入图像时,前后缓冲区进行对调,即前缓冲区变成后缓冲区、后缓冲区变成前缓冲区。这样一来,刚刚绘制在后缓冲区的图像就能顺利地传给显示器了。这样就避免了写入缓冲区的时候直接和屏幕进行交互的问题。
    • 垂直同步(Vsync)   但是即使双缓冲区仍然可能出现前缓冲区数据在向屏幕绘制途中发现前后缓冲区兑换。那么就需要垂直同步(Vsync)垂直同步(Vsync)是加在两帧之间。跟水平同步脉冲类似,但它指示着前一帧的结束,和新一帧的开始。它的作用就是相当于给帧与帧之间加一个锁,当前一帧还没扫描完之前,下一帧画面绝对不会存入帧缓冲区。

    掉帧

    掉帧.png

    如图,正常的流程中,在每一帧进行切换前,GPU就会把已经处理好的图像存入帧缓冲区(FrameBuffer)中,视频控制器从帧缓冲区中拿到数据,并进行数模转换,并进行显示。但是由于GPU/CPU的效率低或者其他原因,在第一帧和第二帧切换时,帧缓冲区并没有处理好的B数据,所以屏幕只能重复渲染A图片,这样的情况就叫做掉帧

    三缓冲区(Triple Buffering)

    三缓冲区使用一个前置缓存和两个后置缓存。在着色完第一个后置缓冲区的数据后,立即开始处理第二个后置缓冲区。有3个缓冲区,显卡无需等待前缓冲区清空进而腾出后缓冲区,随时可以把渲染结果放入第3个缓冲区。这样即便有一个缓冲区被禁止交换,另外两个缓冲区还是可以来回写入图像,于是就不需要人为增加画面延迟了。

    相关文章

      网友评论

        本文标题:视频撕裂及掉帧的原因

        本文链接:https://www.haomeiwen.com/subject/lxbwqktx.html