2

我正在为使用 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?
4

3 回答 3

2

为了使缓冲区交换与屏幕刷新同步(vsync 所做的),您实际上需要有多个要交换的缓冲区。因此,双缓冲将是必要的。

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

于 2013-07-04T21:38:30.957 回答
2

在过去使用 CRT 显示器时,可以在单缓冲模式下进行垂直同步。当电子束从屏幕的右下角返回到左上角时,会有几毫秒的延迟——垂直同步间隔——如果你可以在这段短暂的时间内完成所有的渲染,那么屏幕会平滑更新而不会撕裂.

在 Atari 400/800 和 Amiga 个人计算机等控制台上,真正的核心程序员通过“竞速”获得更多时间来渲染,在扫描电子束之前从上到下更新帧缓冲 RAM。

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

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

于 2013-07-04T23:45:59.483 回答
1

GDI 和 OpenGL 没有 VSYNC 控制。

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

于 2013-07-04T01:43:37.550 回答