【发布时间】:2013-07-03 18:29:17
【问题描述】:
我正在为使用 OpenGL 执行渲染的科学应用程序编写时间关键代码。我正在控制的设备看起来像电脑显示器。梦想是以 60 赫兹的频率刷新设备。
我尝试使用单缓冲区光栅模式,但无法让 vsync 正常工作。在双缓冲模式下它可以工作。
你可以对单个缓冲上下文进行 vsync 吗?
作品
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 24;
pfd.cDepthBits = 16;
pfd.iLayerType = PFD_MAIN_PLANE;
没用
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 24;
pfd.cDepthBits = 16;
pfd.iLayerType = PFD_MAIN_PLANE;
编辑
在我的渲染循环结束时
glFlush();
glFinish();
swapBuffers();//GDI?
【问题讨论】:
-
在双缓冲中,
wglSwapBuffers调用会等到下一个 vsync。使用单缓冲,您可以在一个连续的命令序列中直接渲染到流。你认为哪个函数调用应该等到下一个 vsync ? -
在 Direct3D 中,您可以调用
IDirect3DDevice9Ex::WaitForVBlank。我很确定 OpenGL 没有标准函数来阻止调用线程,直到 VSYNC 中断发生,但是有一些特定于供应商的扩展。 -
在单缓冲模式下,有
glFlush(),基本上相当于glSwapBuffers()。 -
@YohanDanvin:
glSwapBuffers暗示glFlush/glFinish,但反之则不然。您可以轻松地在每帧中拥有多个刷新栅栏(如果您渲染到辅助缓冲区然后将其用作源纹理,您会这样做) -
我知道。我的评论更针对@Mikhail 提示提示:您应该提供有关您正在做什么以及“不起作用”的意思的更多信息。