我拼命地努力让Vsync在我的OpenGL应用程序中工作。重要数据如下:

我正在使用Windows,在C++ OpenGL中进行编码,并且在我的OpenGL上下文(双缓冲)中使用了FreeGLUT。我知道要让交换缓冲区等待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

  • 我希望这对以后的人有所帮助。感谢你的帮助。

    07-24 14:38