由于今天的卡片似乎保留了一个渲染命令列表并且仅在调用glFlush
或glFinish
时刷新,是否真的需要双缓冲?我在Linux(ATI Mobility radeon卡)上使用SDL / OpenGL开发的OpenGL游戏实际上在SDL_GL_swapbuffers()
被glFinish()
替换为SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,0)
并且在初始化代码中被{{1}}时更少闪烁。这是我的卡的特殊情况还是所有卡上都有这种情况?
答案 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。许多实现只对后端缓冲区进行多重采样;前缓冲区未进行多重采样。执行交换将从多重采样缓冲区中进行缩减采样。