【问题标题】:glfwSwapInterval(1) fails to enable vsync?glfwSwapInterval(1) 无法启用垂直同步?
【发布时间】:2013-04-23 12:38:12
【问题描述】:

glfwSwapInterval(1) 似乎对我不起作用。如果我在 CCC 中强制 VSync 或在 SFML 中强制使用 setVerticalSyncEnabled(true),我的 fps 会下降到 60,但 GLFW 只会继续以 9000 fps 运行。我是不是走错了路,还是 GLFW 被窃听了?

【问题讨论】:

  • 您使用的是什么 GPU? GLFW 常见问题解答says something 关于glfwSwapInterval 不适用于某些 ATI 驱动程序。我从来没有用过 GLFW,但你能不能直接打电话给(PFNWGLSWAPINTERVALEXTPROC)wglGetProcAddress("wglSwapIntervalEXT")
  • @EdwardA 是的,它是 ATI。那为什么它会在 SFML 中工作呢? wglSwapIntervalEXT 出于某种原因工作......所以 GLFW 被窃听了?
  • 我不能肯定地告诉你,虽然如果wglSwapIntervalEXT 有效,那肯定意味着它与 GLFW 有关。您可以尝试下载GLFW source,与它一起编译您的程序并设置断点@line 831 window.cline 1638 win32_window.c 以查看实际情况。如果检查失败,它可能是其中之一。
  • 嗯..._glfwIsCompositionEnabled() 返回真。哦,那么必须手动完成。谢谢:)
  • @EdwardA This GLFW issue 已在 3.1.2 版中修复。

标签: c++ windows opengl glfw


【解决方案1】:

看起来 GLFW 不想在启用桌面合成时打开 VSync。如果您仍然想要 VSync,这将在 Windows 上运行:

#ifdef _WIN32
    // Turn on vertical screen sync under Windows.
    // (I.e. it uses the WGL_EXT_swap_control extension)
    typedef BOOL (WINAPI *PFNWGLSWAPINTERVALEXTPROC)(int interval);
    PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT = NULL;
    wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)wglGetProcAddress("wglSwapIntervalEXT");
    if(wglSwapIntervalEXT)
        wglSwapIntervalEXT(1);
#endif

对于其他操作系统,谷歌会帮助你。

【讨论】:

  • 此修复不适用于我的 Intel HD 4600,因为 proc 地址为 0。但将 GLFW3 配置为使用 GLFW_USE_DWM_SWAP_INTERVAL 可以。
【解决方案2】:

使用 GLFW_USE_DWM_SWAP_INTERVAL 选项重建 GLFW3。

glfw/src/config.h

GLFW 文档警告抖动问题,但我自己没有看到。

【讨论】:

  • 在 3.1.2 版中删除了这个标志;但是,修复程序也在,因此不再需要它:)
【解决方案3】:

发现glfwSwapInterval在窗口模式和全屏模式之间切换后需要再次调用,否则帧率会很大。

if (fullScreen)
            {
                glfwSetWindowMonitor(window, monitor, 0, 0, monitorMode->width, monitorMode->height, monitorMode->refreshRate);

                // Added to fix framerate to vertical refresh //
                glfwSwapInterval(1);
            }
            else
            {
                glfwSetWindowMonitor(window, NULL, 0, 0, monitorMode->width, monitorMode->height, monitorMode->refreshRate);
            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    相关资源
    最近更新 更多