我正在尝试编写一个视频播放器,它将以精确的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?如果是这样结束,怎么样?我可以使用你的任何建议,因为我真的尝试了我所知道的一切。
答案 0 :(得分:0)
如果由于某种原因你迟到了缓冲区交换,那么当启用VSYNC时,你将最终绘制1帧以进行至少两次监视器刷新。
如果您的驱动程序支持自适应VSYNC(大多数NV和AMD驱动程序都支持),我建议先尝试一下。这样它的速度永远不会超过60 FPS,但是如果你稍晚一点就不会对你造成伤害。检查此WGL
扩展程序:WGL_EXT_swap_control_tear
如果支持,则可以将 -1 传递给glfwSwapInterval (...)
。扩展不会添加任何新函数,它只是为交换间隔的负值赋予意义。
GLFW可能太愚蠢而无法接受负值(我从未尝试过),您可能必须直接与特定于平台的函数接口:wglSwapIntervalEXT (...)