由于今天的卡片似乎保留了渲染命令列表,并且只在调用glFlush
或glFinish
时才刷新,是否真的需要双缓冲?我在Linux上开发的OpenGL游戏(ATI Mobility radeon卡)与SDL/OpenGL实际上闪烁较少,当SDL_GL_swapbuffers()
被替换为glFinish()
和SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,0)
在init代码中时。这是我的卡片的特殊情况还是所有卡片上都有这种情况?是否需要双缓冲
编辑:我发现原因是KWin。看起来像datenwolf说的那样,没有同步的合成是原因。当我关闭KWin合成时,游戏无需任何源代码补丁即可正常工作
提到的帖子已超过6岁。 X11是否还缺少同步方案?那么Windows呢? –
除了datenwolf的解释,你应该注意到你通常不会调用'glFlush'或'glFinish',除非在一些非常非常罕见的特殊情况下。 'glFinish'什么也不做('wgl | glx)SwapBuffers'没有做过(假设vsync被启用),'glFlush'只刷新排队的命令并且告诉服务器开始处理它们,这在最好的情况(但是是无用的调用和上下文切换),并且在最坏的情况下导致更差的性能(由于GPU资源的次优调度)。 – Damon
理想情况下,您会希望尽可能多地在GL上执行命令,并尽可能扩展依赖关系(例如,如果使用纹理,首先发送命令来定义纹理图像,设置纹理状态等,然后发送一些执行其他操作的命令,然后只绘制使用此纹理的东西)。这可以确保:a)由于依赖关系,命令流中的命令不太可能被阻止; b)如果队列中的命令停顿,驱动程序可以安排其他一些命令来利用GPU(OpenCL或其他程序?)。 – Damon