为什么在交换缓冲区后调用 GL.Finish 可以防止低端硬件出现大量卡顿,但在现代 GPU 上却不能?

Why does invoking GL.Finish after swapping buffers prevent lower end hardware from massive stuttering, but not on modern GPUs?

我正在以每秒数百帧的速度进行渲染。因为游戏是 FPS,所以打开 vsync 是不可取的。

出于某种原因,我不明白,在任何现代 GPU(过去 7 年左右的任何离散 GPU)上,它都能完美、快速和流畅地渲染。

但是,如果在任何集成 GPU 或较旧的 GPU 上完成,则会出现大量卡顿,以至于无法播放。此外,用户感觉似乎有 100 毫秒的延迟。

出于某种原因,如果我在 SwapBuffers() 之后立即执行 GL.Finish(),对于 integrated/older 个 GPU,这个问题会得到很大缓解。

这是为什么?

在交换缓冲区后调用 GL.Finish() 对我来说毫无意义,因为我认为渲染命令需要在交换缓冲区之前完全执行,以便监视器可以获取所有交换前发出的绘图命令。

交换默认帧缓冲区可能导致管道刷新,但它也可能决定不这样做。 [Reference]

甚至不能保证 SwapBuffer 真的等到缓冲区交换完成。某些实现可能决定仅将缓冲区交换放入命令队列中,然后立即 return 。因此,如果 GPU 在交换时不刷新,GL.Finish 将刷新管道。

您可能还想阅读此主题:https://community.khronos.org/t/swapbuffers-and-synchronization/107667 因为它更详细地讨论了该主题。