使用vsync执行glTexImage2D时出现奇怪的延迟

时间:2013-11-19 13:45:25

标签: c++ qt opengl vsync

我正在编写一个视频软件,我正在使用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需要大约16ms才能执行。让我感到困惑的是glTexImage2D也需要1..16ms的时间来执行,就好像它还在等待VBLANK信号一样。当我使用swapInterval为0关闭vsync时,glTexImage2D只需要大约1 ms来执行。现在,而不是整个程序vsync的16ms延迟应该给我,而在最坏的情况下我得到32ms的延迟。我不明白为什么updateGL和glTexImage2D都等待VBLANK。我希望尽可能少地延迟,以便有人解释这里发生了什么?

1 个答案:

答案 0 :(得分:2)

glTexImage2D是一个非常昂贵的调用,因为它从头开始重新初始化整个纹理对象。要更新视频纹理图像,请使用glTexSubImage2D,这要快得多。您可以将它与像素缓冲区对象结合使用,以使OpenGL更加异步操作。