opengl - 使用 FBO+RBO 和 glFinish() 进行双缓冲

标签 opengl opengl-3

我使用的是 FBO+RBO,并且不是在默认帧缓冲区上进行常规双缓冲,而是绘制到 RBO,然后直接在单个缓冲 OpenGL 上下文中的默认 FBO (0) 的 GL_FRONT 缓冲区上进行 blit。

这很好,我没有任何闪烁,但如果场景变得有点复杂,我会经历 fps 的巨大下降,这很奇怪,我知道一定出了问题。我的意思不是因为同步跳过而从 1/60 到 1/30,我的意思是 fps 突然下降 90%。

我在 blit 之后尝试了 glFlush() - 没有区别,然后我在 blit 之后尝试了 glFinish(),并且我的 fps 提高了 10 倍。

因此,我在默认帧缓冲区和 swapbuffers() 上使用了常规双缓冲,并且 fps 也得到了提升,就像使用 glFinish() 时一样。

我不知道发生了什么。为什么 glFinish() 会产生如此大的差异,而它本不应该如此?并且,可以直接在前端缓冲区上使用 RBO 和 blit,而不是在双缓冲上下文中使用交换缓冲区调用吗?我知道我缺少垂直同步,但复合管理器无论如何都会同步(事实上我没有看到任何撕裂),就像显示器缺少 10 帧中的 9 帧一样。

出于好奇, native swapbuffers() 是否在 Windows 或 Linux 上使用 glFinish() ?

最佳答案

我认为这是一个与同步相关的问题。

当直接渲染到 RBO 并位图传输到前端缓冲区时,根本没有任何同步。因此,在复杂的场景中,GPU 命令队列将很快填满,然后 CPU 驱动程序队列也将很快填满,直到驱动程序在 OpenGL 命令期间强制进行 CPU 同步。此时CPU 线程将停止。

我的意思是,如果没有任何形式的同步,复杂的渲染(将一个或多个 OpenGL 命令放入队列的渲染)总是会导致 CPU 线程在某个时刻停止,因为随着队列将会填满,CPU 将发出越来越多的命令。

为了获得流畅(更稳定)的用户交互,需要进行同步(使用特定于平台的 swapbuffers() 或 glFinish()),以阻止 CPU 发出越来越多的命令,使事情变得更糟(这反过来又会使 CPU 线程稍后停止)

引用: OpenGL Synchronization

关于opengl - 使用 FBO+RBO 和 glFinish() 进行双缓冲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17608337/

相关文章:

opengl - 使用 VBO 的纹理绑定(bind)无法正常工作

linux - 无法使用 Linux/Mesa 编译着色器

c++ - Opengl 3.3 C++运行时错误 'vector subscript out of range'

c++ - 使用 Stencil-buffer 绘制 3D 模型的轮廓

c++ - 在渲染纹理上绘制时出现问题。 (OpengL 3.3)

c++ - 生成球体

c++ - OpenGL 3 如何放大 GL_TEXTURE RECTANGLE?

winapi - 使用 GL_RGBA 颜色缓冲区设置 Win32 OpenGL 窗口

c++ - 多纹理 OpenGL GLUT C++

c++ - 将一个 int 传递给一个函数,然后使用该 int 创建一个数组