次のコードでフレームを表示するために 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 も VBLANK 信号を待っているかのように、実行に 1..16ms の時間がかかることです。swapInterval を 0 にして vsync をオフにすると、glTexImage2D の実行には約 1 ミリ秒しかかかりません。ここで、vsync が提供するはずのプログラム全体の 16 ミリ秒の遅延の代わりに、最悪でも 32 ミリ秒の遅延が発生します。updateGL と glTexImage2D の両方が VBLANK を待機する理由がわかりません。遅延をできるだけ少なくしたいので、誰かがここで何が起こっているのか説明してもらえますか?