0

次のコードでフレームを表示するために 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 を待機する理由がわかりません。遅延をできるだけ少なくしたいので、誰かがここで何が起こっているのか説明してもらえますか?

4

1 に答える 1

2

glTexImage2Dテクスチャ オブジェクト全体を最初から再初期化するため、非常にコストのかかる呼び出しです。ビデオ テクスチャ イメージを更新するだけの場合glTexSubImage2Dは、はるかに高速な方を使用します。これをPixel Buffer オブジェクトと組み合わせて、OpenGL の非同期操作をさらに可能にすることができます。

于 2013-11-19T14:05:42.397 に答える