【发布时间】: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