更详细地了解缓冲区交换

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

I-当vsync关闭时,只要开发人员交换前/后缓冲区,GPU正在读取并发送到监视器的缓冲区将更改为新缓冲区,而不管是否正在读取旧缓冲区(即不需要vblank)。

II-启用vsync时,不会立即交换缓冲区,仅在完全读取旧缓冲区(即需要vblank)时才更改缓冲区。

III-关闭垂直同步可以将帧率提高到大于监视器刷新率,但是在读取缓冲区时交换缓冲区会出现屏幕撕裂

IV-打开vsync可以防止撕裂,但是监视器刷新率会限制FPS。

基于此,我尝试执行以下实验:我禁用了vsync,并且每帧我都使用glClearColor + glClear用纯色渲染所有像素,并选择每帧新的随机颜色。我在60Hz显示器中得到了约2400FPS。由于我每隔一帧交换一次缓冲区,并且由于监视器在每张全屏绘画中花费1/60秒的时间,因此我期望每次刷新监视器时,缓冲区都会被交换大约40次。这是因为在1/60 s中,大约有40个缓冲区交换调用。由于每次更换缓冲区时,清晰的颜色都是不同的,所以我希望看到撕裂的图像看起来很杂乱,有很多不同的颜色。相反,通过截取一些屏幕截图,我没有看到任何撕裂……每个像素都具有相同的纯色。

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

谢谢!

chaoyangxx2003 回答:更详细地了解缓冲区交换

问题与窗口管理器有关。全屏运行时,我可以看到预期的行为。

本文链接:https://www.f2er.com/2449513.html

大家都在问