更详细地了解缓冲区交换
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 经理有关。当我 运行 全屏时,我可以看到预期的行为。
这更像是一个理论问题。这是我对缓冲区交换和 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 经理有关。当我 运行 全屏时,我可以看到预期的行为。