【问题标题】:OpenGL unable to sync "player" FPS to monitor refresh rateOpenGL 无法同步“玩家”FPS 以监控刷新率
【发布时间】:2013-12-15 09:10:24
【问题描述】:

我正在尝试编写一个视频播放器,它将以精确的 FPS 作为显示器刷新率(假设它是 60Hz)播放。 我在 Windows 上编写 c++ (VS2010) 并使用 OpenGL。 我有一台非常强大的 PC,当没有设置同步时,我可以达到 500FPS。

这是相关代码:

   glfwSwapInterval(1);
   while (1)
   {
     glBindTexture(GL_TEXTURE_2D,Texture[frameIndexInArray]);
     glBegin(GL_POLYGON);
     glNormal3f(0.0f, 0.0f, 1.0f);
        ...
     glVertex3f(-1.0f, 1.0f, 0.0f);
     glEnd();
     glFinish();
     glfwSwapBuffers(window);
     glfwPollEvents();
        ...
   }

图形驱动程序上的垂直同步选项设置为“开”。 我有一个采集器,可以通过 DP 电缆记录我的输出。 (我知道它工作正常)

我的问题是我的播放器在几百帧中出现一次不同步, 输出为:frame(n-1), frame(n), frame(n), frame(n+1) ...(双帧) 或者也可以是:frame(n-1), frame(n), frame(n), frame(n+2) ... (double and skip frame)

我尝试使用 glfwSwapInterval (0) 并将图形驱动程序中的 vsync 设置为“应用程序设置”,我尝试不使用 glFinish(),我什至尝试使用 SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL) 赋予线程高优先级;

是否有可能精确到 60FPS?如果是这样,怎么办??我可以使用您的任何建议,因为我确实尝试了我所知道的一切。

【问题讨论】:

  • 在交换之前调用glFinish (...) 可能会增加您交换缓冲区来不及满足 VSYNC 截止日期的可能性。它只会加剧你的问题。

标签: opengl video-processing glfw


【解决方案1】:

如果由于某种原因您在缓冲区交换上迟到了,那么在启用 VSYNC 时,您将最终绘制 1 帧以进行至少两次显示器刷新。

如果您的驱动程序支持自适应 VSYNC(大多数 NV 和 AMD 驱动程序都支持),我建议您先尝试一下。这样一来,它的绘制速度永远不会超过 60 FPS,但如果你稍微晚了一点,它也不会惩罚你。检查此WGL 扩展:WGL_EXT_swap_control_tear,如果支持,您可以将 -1 传递给glfwSwapInterval (...)。该扩展没有添加任何新功能,它只是为交换间隔的负值赋予意义。

GLFW 可能太笨了,无法接受负值(我从未尝试过),并且您可能必须直接与特定于平台的函数进行交互:wglSwapIntervalEXT (...)

【讨论】:

  • 我的 PC 中有一个集成 GPU,我换了一台带有 AMD 显卡的新 PC,现在看起来工作正常,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
相关资源
最近更新 更多