c++ - 在 OpenGL 中使用过剩的 vsync 问题

标签 c++ windows opengl freeglut vsync

我拼命地想让 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/

相关文章:

ruby - Puppet Windows 包提供程序编码错误

java - 有人可以告诉我为什么这个java代码在Mac(或unixlike)和Windows上运行时得到不同的答案吗

c++ - 三角形不出现在OpenGL中?

c++ - 使用 VMIME/libcurl 不通过服务器发送电子邮件(或 : SMTP server library)

c++ - const_cast 是否会导致实际的代码排放?

c++ - MacOSx - 使用 make 命令编译 C 项目

c++ - OpenGL:如何只更新纹理的一部分?

c++ - 使用 QTCreator 的 Debug模式禁用优化

windows - SHAutoComplete 和当前工作目录?

c++ - 关于在opengl上绘制矩形的问题