我正在编写一个视频软件,我使用 Qt 的 QGLWidget 来显示带有以下代码的帧:
glTexImage2D(GL_TEXTURE_2D, 0, (color ? GL_RGB8 : GL_LUMINANCE8), VIDEO_WIDTH, VIDEO_HEIGHT, 0, (color ? GL_RGB : GL_LUMINANCE), GL_UNSIGNED_BYTE, (GLubyte*)imBuf);
glBegin(GL_QUADS);
glTexCoord2d(0.0,0.0); glVertex2d(-1.0,+1.0);
glTexCoord2d(1.0,0.0); glVertex2d(+1.0,+1.0);
glTexCoord2d(1.0,1.0); glVertex2d(+1.0,-1.0);
glTexCoord2d(0.0,1.0); glVertex2d(-1.0,-1.0);
glEnd();
updateGL();
我想使用 vsync,所以我将 swapInterval 设置为 1。我测量了执行上述代码的时间。正如预期的那样,updateGL 需要大约 16 毫秒来执行。令我困惑的是,glTexImage2D 也需要 1..16 毫秒的时间来执行,就好像它也在等待 VBLANK 信号一样。当我在 swapInterval 为 0 的情况下关闭 vsync 时,glTexImage2D 只需要大约 1 毫秒即可执行。现在,而不是整个程序 vsync 应该给我的 16 毫秒延迟,我得到的最坏的延迟是 32 毫秒。我不明白为什么 updateGL 和 glTexImage2D 都等待 VBLANK。我希望尽可能少地延迟,所以有人可以解释这里发生了什么吗?