在vsync打开的情况下执行glTexImage2D时出现奇怪的延迟

Strange delay when executing glTexImage2D with vsync on

本文关键字:延迟 执行 vsync 情况下 glTexImage2D      更新时间:2023-10-16

我正在编程一个视频软件,我使用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应该给我的整个程序16ms的延迟不同,我得到了最坏的32ms的延迟。我不明白为什么updateGL和glTexImage2D都在等待VBLANK。我想尽可能少地拖延,所以有人能解释一下这里发生了什么吗?

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