14

由于今天的卡片似乎保留了渲染命令列表并仅在调用glFlushor时刷新glFinish,真的需要双缓冲吗?我正在使用 SDL/OpenGL 在 Linux(ATI Mobility radeon 卡)上开发的 OpenGL 游戏在被 init 代码SDL_GL_swapbuffers()替换glFinish()时实际上闪烁较少。SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,0)这是我卡的特殊情况还是所有卡都可能出现这种情况?

编辑:我发现这是KWin的原因。似乎正如 datenwolf 所说,没有同步的合成是原因。当我关闭 KWin 合成时,游戏运行良好,无需任何源代码补丁

4

2 回答 2

21

双缓冲和glFinish是两个非常不同的东西。

glFinish阻塞程序,直到所有绘图操作完成。

双缓冲用于向用户隐藏渲染过程。如果没有双缓冲,假设显示刷新频率无限高,每一个绘图操作都会立即变得可见。在实践中,您会得到一些显示伪影,例如场景的某些部分在一种状态下可见,其余部分不可见或在某些其他状态下,图片可能不完整等。双缓冲通过首先渲染到后台缓冲区来避免这种情况,并且仅在渲染完成后将其与前端缓冲区交换回来,然后将其发送到显示设备。

现在,合成窗口管理变得很流行:Windows 有 Aero、MacOS X Quartz Extreme,在 Linux 上至少 Unity 和 GNOME3 shell 使用合成(如果可用)。关键是:从技术上讲,合成创建了双缓冲:Windows 绘制到屏幕外缓冲区,最终屏幕被合成。因此,如果您在一台具有合成功能的机器上运行,那么如果在您的程序中执行双缓冲,那么双缓冲是一种冗余,而它所需要的只是某种同步机制,以便在下一帧准备好时告诉合成器。MacOS X 有这个。X11 仍然缺乏适当的同步方案,请参阅邮件列表上的这篇文章:http: //lists.freedesktop.org/archives/xorg/2004-May/000607.html

TL;DR:双缓冲glFinish是不同的东西,你需要双缓冲(某种)让事情看起来不错。

于 2011-07-01T06:36:48.953 回答
2

我希望它更多地与您正在渲染的内容或您的硬件有关,而不是任何可以推广到不在您的机器上的东西。所以不:不要尝试这样做。

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

于 2011-07-01T05:42:46.460 回答