1、什么是图像撕裂?
图像撕裂是指我们肉眼看见一张图片上下两层发生了错位,如下图所示:
![](https://img.haomeiwen.com/i20589734/a18522f05bf4fc8d.png)
2、为什么会发生图像撕裂?
GPU在渲染图片的时候,视频控制器是从帧缓冲区里面取数据,然后经过数模转换,最后将图片展现在显示上。正常情况是没有问题的,特殊情况是当GPU还没有将图片展现完成时,帧缓冲区数据已经更新为下一帧的数据,此时视频控制器只负责取出数据,它并不知道该数据已经被更新了,因此继续执行取数据,数模转化,展示图片的操作,此时,显示器上的图片就会表现为撕裂。
3、有什么办法可以解决图像撕裂?
苹果引入了:垂直同步Vsync + 双缓冲区DoubleBuffering的解决办法。
垂直同步Vsync:对帧缓冲区增加一个加锁的操作,不允许视频控制器在从缓冲区读取数据的过程中对帧缓冲区的数据进行修改。
双缓冲区DoubleBuffering:由于对帧缓冲区加锁了,如果只有一个帧缓冲区效率太低,因为每次都必须得上个缓冲区的数据被读取完成才对下一帧的数据进行处理。因此,可以采用双帧缓冲区来解决效率低的问题,视频控制器可以读取A缓冲区的数据,而处理数据可以在B缓冲区执行,当A缓冲区的数据被显示完成,视频控制器切换从B缓冲区中读取,而A缓冲区处理数据。
4、双缓冲区有什么弊端?
引入双缓冲区机制后,会有一个新的弊端,即:掉帧。
掉帧是指在屏幕上显示的是上一帧的数据,肉眼看到像是图像卡住了一样。
![](https://img.haomeiwen.com/i20589734/6ab072e77afcc67f.png)
上图展示了掉帧形成的原因:每帧画面处理的时间约为16.7ms,上图第1个16.7ms内,CPU和GPU对数据处理完成,图像正常显示。在第2个16.7ms内,由于CPU和GPU处理数据的时间较长,导致16.7ms内视频控制器并没有将帧缓冲区的数据处理完成,当第3个16.7ms时,视频控制器处理的仍然是上一个帧缓冲区的数据,并没有进行缓冲区切换,此时出就现了掉帧的情况。
5、掉帧的情况是否可以避免?
目前,掉帧的情况不可以避免,只能对掉帧的情况进行优化,减少掉帧。可以引入三缓冲区的方案,但是即使引入了三缓冲区,也无法完全避免掉帧。
网友评论