是否需要双缓冲

时间:2011-07-01 05:28:18

标签: opengl sdl-opengl

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

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

2 个答案:

答案 0 :(得分: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是不同的东西,你需要双缓冲(某种)才能让事情看起来很好。

答案 1 :(得分:2)

我希望它与你渲染的东西或硬件有关,而不是任何可以推广到你机器上的东西的东西。所以不:不要试图这样做。

哦,别忘了multisampling。许多实现只对后端缓冲区进行多重采样;前缓冲区未进行多重采样。执行交换将从多重采样缓冲区中进行缩减采样。