OpenGL无法同步“播放器”FPS以监控刷新率

时间:2013-12-15 09:10:24

标签: opengl video-processing glfw

我正在尝试编写一个视频播放器,它将以精确的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();
        ...
   }

图形驱动程序上的垂直同步选项设置为“on”。 我有一个抓取器,通过DP电缆记录我的输出。 (我知道它运作良好)

我的问题是,我的播放器,一旦在几百帧内变得不同步, 输出为:帧(n-1),帧(n),帧(n),帧(n + 1)......(双帧) 或者它也可以是:frame(n-1),frame(n),frame(n),frame(n + 2)...(double和skip frame)

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

是否有可能获得60FPS?如果是这样结束,怎么样?我可以使用你的任何建议,因为我真的尝试了我所知道的一切。

1 个答案:

答案 0 :(得分:0)

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

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

GLFW可能太愚蠢而无法接受负值(我从未尝试过),您可能必须直接与特定于平台的函数接口:wglSwapIntervalEXT (...)