opengl - 更详细地了解缓冲区交换

标签 opengl gpu vsync

这更多的是一个理论问题。这是我对缓冲区交换和垂直同步的理解:

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/

相关文章:

haxe - 是否有一种编程方式可以在运行时更改 Haxe/Starling 中的 vsync?

c++ - opengl VBO 渲染不能正常工作

c++ - 在未加载上下文的情况下在对象构造函数中使用 OpenGL 函数

windows - DirectDraw 游戏可以在不锁定的情况下访问后备缓冲区吗?

python - 如何查找AMD显卡数据

android - 安卓中的VSYNC是什么

c++ - OpenGL 中的着色器问题

C++ - 将多个图像放在数组指针中

arrays - arrayfun 具有具有不同维度输入的函数

html - 如何在 HTML5 canvas 上获得 vsync 回调?