浅谈图像撕裂问题及解决方法
图像撕裂问题及解决方法
什么是图像撕裂 就是一张图片在显示的时候分成了两半,即出现断层。如下图:
图像撕裂是如何形成的呢 我们先从图像的显示说起:
图像 -> CPU将图片解码,交给GPU -> GPU进行图像的渲染 -> 存储到到帧缓存区 -> 视频控制器进行读取帧缓存区信息,并刷新部件(视频控制器只是负责帧缓存区与显示器的对应关系) -> 显示器逐行扫描显示。
在视频控制器进行读取显示图像时,当当前这一帧的内容还未读取完成时,GPU将新的一帧内容提交到帧缓冲区并把两个帧缓冲区进行更新后,视频控制器就会把新的一帧数据的下半段显示到屏幕上,造成画面撕裂的现象。
既撕裂就是在于显卡输出帧的速度比显示器快,显示器的处理速度跟不上显卡,在显示器处理显卡丢过来的第1帧的时候,第2帧就又到了,导致同一个画面同时出现1、2两帧,撕裂就产生了。
图像撕裂如何解决呢
1.垂直同步
垂直同步又称场同步(Vertical synchronization),从CRT显示器的显示原理来看,单个像素组成了水平扫描线,水平扫描线在垂直方向的堆积形成了完整的画面。显示器的刷新率受显卡DAC控制,显卡DAC完成一帧的扫描后就会产生一个垂直同步信号。
【浅谈图像撕裂问题及解决方法】简而言之:垂直同步就是加锁,在当前读取的帧数据结束之前,不会读取下一帧的数据。
2.双缓冲区
双缓冲区是在帧缓存区中开辟两个缓冲区,一个缓冲区通过视频控制器进行当前帧数据的读取显示,另一个缓冲区进行接收下一帧GPU渲染的图像。两个缓冲区都执行结束,然后再交换缓冲区。
弊端:使用以上两个解决方案后,图像撕裂问题解决了,但是有引发了一个新问题掉帧/卡顿。
掉帧/卡顿是如何生成的
文章图片
在使用垂直同步和双缓冲区时,都有一个等待显示完成的过程,从而刷新的时间变慢,刷新频率减少,眼睛看到的图像就会变成卡顿。
三缓冲区 在双缓冲区的基础上再添加一个缓冲区,提高交换速率,减少卡顿。
推荐阅读
- Java|Java OpenCV图像处理之SIFT角点检测详解
- 性能测试中QPS和TPS的区别
- ImageLoaders 加载图像
- 浅谈教育与医学之本质和医学生培养之三观
- JAVA图像处理系列(四)——噪声
- 浅谈朋友圈
- 使用交叉点观察器延迟加载图像以提高性能
- Figure|Figure 图像
- 《浅谈减压方式在趣味首饰中的表现》
- 【数组题】给定一个二进制矩阵|【数组题】给定一个二进制矩阵 A,我们想先水平翻转图像,然后反转图像并返回结果。