OpenGL双缓冲,速度超过60 fps

OpenGL双缓冲,速度超过60 fps,opengl,doublebuffered,Opengl,Doublebuffered,具有双缓冲的OpenGL应用程序如何达到60 fps以上(dislay刷新限制)? 它是否取决于驱动程序的实现,即它是使用双缓冲还是三缓冲 考虑下一个应用程序主循环: while (1) { draw_scene(); swap_buffers(); } 如果我不使用display vsync的一些奇特的同步,也不想在显示图像时撕裂,那么循环中的第二条语句是必需的。通过这样一个循环,我的fps与驱动程序实现相关联:使用双缓冲,管道将暂停,我归档约60 fps,而使用tripple b

具有双缓冲的OpenGL应用程序如何达到60 fps以上(dislay刷新限制)?
它是否取决于驱动程序的实现,即它是使用双缓冲还是三缓冲

考虑下一个应用程序主循环:

while (1) {
  draw_scene();
  swap_buffers(); 
}
如果我不使用display vsync的一些奇特的同步,也不想在显示图像时撕裂,那么循环中的第二条语句是必需的。通过这样一个循环,我的fps与驱动程序实现相关联:使用双缓冲,管道将暂停,我归档约60 fps,而使用tripple buffering,不会发生暂停,我的fps仅取决于我的视频卡吞吐量。所以,如果需要归档高fps的opengl应用程序,我应该在应用程序内部实现三重缓冲。我说得对吗

如何使用双缓冲归档速度超过60 fps(dislay刷新限制)的OpenGL应用程序

通过禁用与显示屏垂直回程的同步

使用双缓冲时,管道将暂停,我将归档约60 fps,而使用tripple buffering时,不会发生暂停,我的fps仅取决于我的视频卡吞吐量

双重缓冲和三重缓冲之间的唯一区别是用于显示的“队列中”帧的数量。实际上,它增加了另一个延迟帧。但是,总帧率不会增加。此外,它试图每秒渲染的帧数超过显示设备所能处理的帧数也没有什么意义


缓冲区交换不会暂停管道!暂停管道意味着管道内的某些操作会迫使设备冲洗整个管道,并且必须重放大量操作,从而降低总吞吐量。然而,缓冲区交换是一个同步点,这意味着它等待管道完成。这实际上是可取的,因为它给了您的GPU和驱动程序一些时间来做其他事情,比如清理标记为释放的内存和类似的事情。duration SwapBuffers块也有利于您的程序进程,因为这给了程序CPU中的其他线程时间,可用于处理用户输入、I/O、网络等。

我无法理解为什么双/三重缓冲会执行帧率上限。当然,显示器有一个固定的、可配置的刷新率(通常为60Hz),但这并不能改变你的应用程序中每帧执行的速度。@ EyNET4请考虑我对DeNeW狼的回答。我希望他们能对我的意思有所启发。那么,你用什么来对应用程序进行基准测试?您确定禁用vsync仍能使应用程序以60 FPS的速度运行吗?缓冲区交换刷新GL,这意味着刷新之前发出的所有命令都应该放在硬件队列中,因此,如果您有双缓冲区,在第一次缓冲区交换之后,渲染到后缓冲区是不可能的,因为它应该保持不变,以便将来在vsync上进行实际交换。所以,当您再次渲染场景并执行另一个缓冲区交换(假设场景非常简单,您可以在不使用双缓冲的情况下归档200 fps)时,如果队列中有足够的空间,您的命令将被放入队列中,但在vsync之前不会执行这些命令。如果你继续在主循环中发出缓冲区交换,应用程序将被阻止。另一方面,如果你有三重缓冲区,硬件总是有一个可用的缓冲区来渲染。换句话说,使用双缓冲区图形硬件会花费一些时间等待vsync,而使用tripple buffer则会持续忙碌。此外,如果我禁用与vsync的同步,则应该注意到撕裂,但事实并非如此。@nshy:当显示只能达到60Hz时,为什么要渲染200Hz的场景?这毫无意义。此外,任何模拟都应基于显示间隔,而不是渲染帧所需的时间。如果确实要实现三重缓冲,可以使用帧缓冲区对象来实现。@nshy:由于自然法则,试图渲染超出显示范围的帧是没有意义的。您的显示器正在采集(您交付给它的帧的)样本。如果以更高的采样率发送信号,则会产生混叠。请参见和–如果您的目标是平滑高质量动画,请确保渲染器在动画的每个V-sync周期和时间内只渲染一帧,以便在渲染动画步骤时,其状态将是显示时间的状态。使用卡尔曼滤波器匹配用户输入。