更新时间:2024-06-23 18:31
所谓“双缓冲区”,故名思义就是要有俩缓冲区(简称A和B)。这俩缓冲区,总是一个用于生产者,另一个用于消费者。
为了解决:绘制屏幕时产生“闪烁”或者“蠕动”。
为什么要使用双缓冲区?通过前面的学习我们知道当要绘制屏幕时,我们只要调用paint函数即可。其中我们可以使用绘图方法来绘制任何文字图形图像。可是当我们绘制的东西多了之后,你就会发现有时屏幕上的显示根本不是我们要的结果,很杂乱。细想想,会知道因为paint函数中,我们是一边绘制一边显示,所以当内容过多,就会产生没绘制完成,就显示到屏幕上的结果。
因此,双缓冲区就提供了一个完美的解决方案。我们可以在缓冲区2中绘制图像,而是用缓冲区1来输出到屏幕。这样我们就可以控制绘制和现实的过程,从而避免上面的现象。
1.为啥要双缓冲区
记得前几天在介绍队列缓冲区 时,提及了普通队列缓冲区的两个性能问题:“内存分配的开销”和“同步/互斥的开销”(健忘的同学,先回去看看那个帖子 复习一下)。“内存分配的开销”已经在介绍环形缓冲区 的时候解决了,而今天要介绍的双缓冲区,就是冲着同步/互斥的开销来的。 为了防止有人给咱扣上“过度设计”的大帽子,又得来一个事先声明:只有当同步或互斥的开销非常明显的时候,你才应该考虑双缓冲区的使用。否则的话,大伙儿还是老老实实用最基本、最简单的队列缓冲区吧。
2.双缓冲区的原理
当俩缓冲区都操作完,再进行一次切换(先前被生产者写入的转为消费者读出,先前消费者读取的转为生产者写入)。由于生产者和消费者不会同时 操作同一个 缓冲区(不发生冲突),所以就不需要在读写每一个 数据单元 的时候都进行同步/互斥操作。顺便提一下,这又一次展现了空间换时间 的优化思路。 但是光有俩缓冲区还不够。为了做到“不冲突”,还得再搞两个互斥锁(简称La和Lb),分别对应俩缓冲区。生产者或消费者如果要操作某个缓冲区,必须先拥有对应的互斥锁。补充一句:要达到“不冲突”的效果,其实可以有多种搞法,今天只是挑一个简单的来聊。