是否可以vsync一个缓冲的上下文?

时间:2013-07-03 18:29:17

标签: c++ winapi opengl

我正在为使用OpenGL执行渲染的科学应用程序编写时间关键代码。我控制的设备看起来像电脑显示器。梦想是以60赫兹的速度刷新设备。

我尝试使用单缓冲光栅模式,但是我无法让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?

3 个答案:

答案 0 :(得分:2)

为了使缓冲交换与屏幕刷新同步(vsync的作用),您需要实际拥有多个缓冲区才能进行交换。因此,双重缓冲将是必要的。

双缓冲后启用vsync的方法取决于平台,但是如a.lasram所示,WGL_EXT_swap_control扩展在Windows上提供此功能。

答案 1 :(得分:2)

在使用CRT监视器的Olden Days中,可以在单缓冲模式下进行vsync。当电子束从屏幕右下方返回到左上角时,有几毫秒的延迟 - vsync间隔 - 如果你可以在那个短暂的时间内完成所有的渲染,屏幕更新顺畅而不会撕裂

Atari 400/800和Amiga个人电脑等游戏机上的真正的核心程序员通过“射束”来获得更多的渲染时间,在扫描电子束之前从上到下更新帧缓冲RAM。 / p>

今天你仍然可以做这样的事情。您可以在Michael Abrash的博客上找到详细信息 http://blogs.valvesoftware.com/abrash,他详细介绍了Oculus Rift VR耳机的延迟问题。

但这取决于知道CPU,系统总线和显示输出的确切时序细节;并且还能够以汇编程序或低级别C编写并控制调度和中断。使用双缓冲是方式,方式,更容易。

答案 2 :(得分:1)

GDI和OpenGL没有VSYNC控制。

实际上,OpenGL不控制渲染缓冲区的存在并将其留给系统。在Windows上,WGL通过扩展名WGL_EXT_swap_control

控制VSYNC