更详细地了解缓冲区交换

Understanding buffer swapping in more detail

这更像是一个理论问题。这是我对缓冲区交换和 vsync 的理解:

I - 当 vsync 关闭时,每当开发人员交换 front/back 缓冲区时,GPU 正在读取和发送到监视器的缓冲区将更改为新缓冲区,无论旧缓冲区是否正在读取(即不需要 vblank)。

II - 当 vsync 打开时,缓冲区不会立即交换,只有当旧缓冲区被完全读取时它们才会被更改(即需要 vblank)。

III - 关闭 vsync 可以将帧率提高到大于显示器刷新率,但在读取缓冲区时交换缓冲区时可能会出现屏幕撕裂

IV - 打开 vsync 可防止撕裂,但显示器刷新率会限制 FPS。

基于此,我尝试进行以下实验:我禁用了 vsync,并且我使用 glClearColor + glClear 以纯色渲染每一帧的所有像素,每帧选择一种新的随机颜色.我在 60Hz 显示器中得到了 ~2400FPS。由于我交换缓冲区的每一帧,并且由于每次全屏绘图显示器需要 1/60 秒,所以我预计每次刷新显示器时,缓冲区大约会被交换约 40 次。这是因为在 1/60 秒内,大约有 40 次缓冲区交换调用。由于每次交换缓冲区时,清晰的颜色都是不同的,因为撕裂,我期待看到一个非常混乱的图像,有很多不同的颜色。相反,通过截取一些屏幕截图,我没有看到任何撕裂......每个像素都有相同的纯色。

有人能指出我的错误假设以及为什么我会看到这种行为吗?

提前致谢!

问题与 window 经理有关。当我 运行 全屏时,我可以看到预期的行为。