这更多的是一个理论问题。这是我对缓冲区交换和垂直同步的理解:
I - 当垂直同步关闭时,每当开发人员交换前/后缓冲区时,GPU 正在读取和发送到显示器的缓冲区都将更改为新缓冲区,无论是否正在读取旧缓冲区(即不需要 vblank)。
II - 当垂直同步打开时,缓冲区不会立即交换,只有当旧缓冲区完全读取时才会更改(即需要 vblank)。
III - 关闭垂直同步可以将帧速率提高到大于显示器刷新率,但在读取缓冲区时交换缓冲区时可能会出现屏幕撕裂
IV - 打开垂直同步可防止撕裂,但显示器刷新率会限制 FPS。
基于此,我尝试做以下实验:我禁用了垂直同步,并且在每一帧中使用 glClearColor
+ glClear
用纯色渲染所有像素,选择一个新的每帧随机颜色。我在 60Hz 显示器上获得了约 2400FPS。由于每一帧我都会交换缓冲区,并且监视器每次全屏绘图需要 1/60 秒,因此我预计每次刷新监视器时,缓冲区都会交换大约 40 次。这是因为在 1/60 秒内,大约有 40 次缓冲区交换调用。由于每次交换缓冲区时,清晰的颜色都会不同,因此由于撕裂,我希望看到一个非常困惑的图像,有很多不同的颜色。相反,通过拍摄一些屏幕截图,我没有看到任何撕裂...每个像素都有相同的纯色。
有人可以指出我的错误假设以及为什么我会看到这种行为吗?
提前致谢!
最佳答案
该问题与窗口管理器有关。当我全屏运行时,我可以看到预期的行为。
关于opengl - 更详细地了解缓冲区交换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61196969/