gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:20:13 30 4
gpt4 key购买 nike

我使用的是 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com