我拼命地想让 Vsync 在我的 OpenGL 应用程序中工作。这是重要的统计数据:
我使用的是 Windows,使用 C++ OpenGL 进行编码,并且我将 FreeGLUT 用于我的 OpenGL 上下文(双缓冲)。我知道要让交换缓冲区在 Windows 中等待垂直同步,您需要调用 wglSwapIntervalEXT()。
我的代码确实调用了它(正如您将在下面看到的),但我仍然在垂直撕裂。我设法阻止它的唯一方法是调用 glFinish(),这当然会带来显着的性能损失。
我的 main() 函数的相关部分如下所示:
//Initiating glut window
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize (initial_window_width, initial_window_height);
glutInitWindowPosition (100, 100);
int glut_window_hWnd = glutCreateWindow(window_title.c_str());
//Setting up swap intervals
PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT = NULL;
PFNWGLGETSWAPINTERVALEXTPROC wglGetSwapIntervalEXT = NULL;
if (WGLExtensionSupported("WGL_EXT_swap_control"))
{
// Extension is supported, init pointers.
wglSwapIntervalEXT = PFNWGLSWAPINTERVALEXTPROC)wglGetProcAddress("wglSwapIntervalEXT");
// this is another function from WGL_EXT_swap_control extension
wglGetSwapIntervalEXT = (PFNWGLGETSWAPINTERVALEXTPROC)wglGetProcAddress("wglGetSwapIntervalEXT");
}
wglSwapIntervalEXT (1)
init ();
glutMainLoop(); ///Starting the glut loop
return(0);
我应该指出,wglInitSwapControlARB 函数的返回值是 true,因此支持扩展。
最佳答案
好的 - 在我在这里收到的巨大帮助和我自己研究和弄乱它的时间之间,我发现了一些东西,包括一个适合我的解决方案(以防其他人遇到这个问题) .
首先,我使用的是 freeGLUT,我将我的代码转换为 GLFW,结果是一样的,所以这不是 API 问题,不要像我一样浪费你的时间!
至少在我的程序中,使用 wglSwapIntervalEXT(1) 不会停止垂直撕裂,这就是导致它如此令人头疼的原因。
当我的 NVIDIA 驱动程序设置为 VSYNC = ON 时,我仍然会流泪(因为这等同于 SwapInterval(1) 但没有帮助) - 但它设置正确,驱动程序正在做我应该做的事情只是不知道,因为我还在流泪。
所以我将我的 NVIDIA 驱动程序设置为 VSYNC = 'Application preference' 并使用 wglSwapIntervalEXT(60) 而不是我一直使用的 1,我发现这确实有效,因为它给了我大约 1Hz 的刷新率.
我不知道为什么 wglSwapIntervalEXT(1) 不垂直同步我的屏幕,但 wglSwapIntervalEXT(2) 具有预期的效果,但显然我现在正在渲染效率低下的所有其他帧。
我发现在禁用 VSYNC 的情况下,glFinish 对撕裂没有帮助,但在启用它的情况下它确实有帮助(如果有人能解释为什么那会很棒)。
总而言之,设置了 wglSwapIntervalEXT(1) 并启用了 glFinish() 我不再有撕裂现象,但我仍然不明白为什么。
这是我的应用程序中的一些性能统计数据(故意加载以使 FPS 低于 60):
- wglSwapIntervalEXT(0) = 撕裂 = 58 FPS
- wglSwapIntervalEXT(1) = 撕裂 = 58 FPS
- wglSwapIntervalEXT(2) = 无撕裂 = 30 FPS
- wglSwapIntervalEXT(1) + glFinish = 无撕裂 = 52 FPS
我希望这对将来的人有所帮助。感谢您的帮助。
关于c++ - 在 OpenGL 中使用过剩的 vsync 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21262944/