什么是交换链? (Direct3D 9)

交换链是用于向用户显示帧的缓冲区集合。 应用程序每次提供要显示的新帧时,交换链中的第一个缓冲区将替代已显示的缓冲区。 此过程称为交换或翻转。

图形适配器有一个指向图面的指针,该图面表示监视器上正在显示的图像,称为前台缓冲区。 随着监视器不断刷新,图形卡会将前台缓冲区中的内容发送至监视器进行显示。 但是,这会导致在渲染实时图形时出现问题。 该问题的核心是,监视器刷新频率与计算机其余部分相比非常缓慢。 通常刷新频率介于 60 Hz(每秒 60 次)到 100 Hz 之间。 如果你的应用程序在监视器刷新过程中更新前台缓冲区,显示的图像将被截成两半,上半部分包含旧图像,下半部分包含新图像。 此问题被称为撕裂。

Direct3D 提供两种避免撕裂的选项:

  • 一种选项只允许监视器在垂直回扫(或垂直同步)操作时更新。 监视器刷新图像的方式通常是水平移动光针,从监视器左上角开始,Z 字形移动到右下角。 光针达到底部后,监视器将重新校准,将其移回左上角,重新开始刷新过程。 此重新校准过程称为垂直同步。在垂直同步期间,监视器不会绘制任何内容,因此在监视器再次开始绘制之前,不会看到对前台缓冲区所做的任何更新。 垂直同步相对较慢,但是,还不足以在等待时渲染复杂场景。 若要避免撕裂,同时能够渲染复杂场景,则需要进行后台缓冲。
  • 一种选项使用后台缓冲技术。 后台缓冲是向屏幕外图面(称为后台缓冲区)绘制场景的过程。 请注意,除前缓冲区之外的任何图面都称为屏幕外图面,因为监视器永远不会直接查看它。 通过使用后台缓冲区,应用程序可以在系统空闲时(即没有正在等待处理的 Windows 消息时)自由渲染场景,而无需考虑监视器刷新频率。 后台缓冲带来了另一个问题:如何以及何时将后台缓冲区移至前台缓冲区。

后台缓冲区移至前台缓冲区的过程称为图面翻转。 由于图形卡只使用指向代表前台缓冲区的图面的指针,所以只需更改指针就可以将后台缓冲区移至前台缓冲区。 当应用程序要求 Direct3D 将后台缓冲区显示到前台缓冲区时,Direct3D 只需“翻转”两种图面指针。 结果是后台缓冲区变成新的前台缓冲区,而旧的前台缓冲区则变成了新的后台缓冲区。 每当应用程序要求 Direct3D 设备显示后台缓冲区时,就会调用图面翻转;但是,可以将 Direct3D 设置为将请求加入队列,直到发生垂直同步。 此选项称为 Direct3D 设备的显示间隔。 请注意,新的后台缓冲区中的数据可能无法重复使用,具体取决于应用程序指定 Direct3D 处理图面翻转的方式。 图面翻转在多媒体、动画和游戏软件中非常关键;其原理相当于用一沓纸来制作动画。 在每页纸上,艺术家对图形稍加改动,当你快速翻动纸张时,图画就会呈现出动画效果。

Direct3D 图面

翻转 Surface (Direct3D 9)