是否需要双缓冲

Sud*_*n S 14 opengl sdl-opengl

因为今天的卡似乎保留了一个渲染命令列表,并且仅在调用时刷新,glFlush或者glFinish是否真的需要双缓冲?我在Linux(ATI Mobility radeon卡)上使用SDL/OpenGL开发的OpenGL游戏实际上在初始化代码中SDL_GL_swapbuffers()被替换为glFinish()和更少时闪烁SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,0).这是我的卡的特殊情况还是所有卡上都有这样的情况?

编辑:我发现原因是KWin.似乎正如datenwolf所说,合成没有同步是原因.当我关闭KWin合成时,游戏在没有任何源代码补丁的情况下工作正常

dat*_*olf 19

双缓冲,glFinish是两个非常不同的东西.

glFinish 阻止程序,直到所有绘图操作完成.

双缓冲用于隐藏用户的渲染过程.假设显示器刷新频率无限高,则在没有双缓冲的情况下,每个单独的绘制操作将立即可见.在实践中,您将获得一些显示工件,例如在一个状态下可见的场景部分,其余部分不可见或处于其他状态,图片可能不完整等等.双缓冲通过首先渲染到后台缓冲区来避免这种情况,并且只有在渲染完成后才用前缓冲器交换它,然后将其发送到显示设备.

现在,合成窗口管理变得普遍:Windows有Aero,MacOS X Quartz Extreme,在Linux上至少Unity和GNOME3 shell使用合成(如果可用).重点是:合成在技术上创造了双重缓冲:Windows绘制到屏幕外缓冲区,其中最终屏幕被合成.因此,如果你在一台带有合成的机器上运行,那么双重缓冲在你的程序中执行是多余的,并且所需要的只是某种同步机制,告诉合成器下一帧何时准备就绪.MacOS X有这个.X11仍然没有适当的同步方案,请参阅maillist上的这篇文章:http://lists.freedesktop.org/archives/xorg/2004-May/000607.html

TL; DR:双缓冲并且glFinish是不同的东西,你需要双缓冲(某种)以使事情看起来很好.

  • 除了datenwolf的解释之外,你应该注意到你通常只需要调用`glFlush`或`glFinish`,除非在一些非常非常罕见的特殊情况下.`glFinish`什么都不做`(wgl | glx)SwapBuffers`还没有做(假设启用了vsync),`glFlush`只刷新排队的命令并发信号通知服务器开始处理它们,这样做没什么好处的case(但是是无用的调用和上下文切换),并且在最坏的情况下导致更差的性能(因为GPU资源的次优调度). (3认同)