上一节课中,我们将窗体中运动的小球数量增加到了1000个。运行后,画面出现了严重的闪烁现象。这一节中,我们将探索画面闪烁的原因,以及寻求其解决方案。
1. 画面闪烁的原因
程序要在屏幕上显示图像,需要经过以下两个步骤:
- 程序将图像放置到显示缓存区中。
- 显卡将显示缓存区中的数据绘制到屏幕上。
我们可以把程序看做快递员,显示缓存区看做快递柜,显卡看做收件人。1000个需要绘制的小球看做快递包裹。
这样,这个过程就变为:
程序将一个快递包裹放置到快递柜。之后,显卡去快递柜取这个快递包裹。
若有1000个快递包裹,程序就需要一个一个将其投递到快递柜中。而显卡,需要一个一个从快递柜中取件。在这种模式下,程序需要投递1000次快递包裹到快递柜中,而显卡也需要从快递柜中取1000次快递。
很显然这种方式会造成很大的处理开销,若程序或显卡无法及时投递或取件,就会造成画面闪烁。
2. 批量绘图
有没有更合适的方式呢?
若程序将1000个快递包裹打包合并成一个快递包裹,再一并投递到快递柜中。显卡只需要从快递柜中取一个合并的快递包裹就好了。这种模式下,程序和显卡仅需投递或收取一次就行。由于之前单次的绘图被合并成一批进行处理,因此,这种方式被称作批量绘图。
有利必有弊,单次绘图模式中,快递员接到一个快递就立刻投递,快递的时效性较高。而批量绘图模式中,快递员等待1000个快递再一起投递,快递的时效性变低了。而大多数程序对显示的时效性没有那么高的要求,批量绘图被广泛地使用在各个场景当中。