我正在拼命地让 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,所以扩展是受支持的。