在vsync打开的情况下执行glTexImage2D时出现奇怪的延迟
Strange delay when executing glTexImage2D with vsync on
我正在编程一个视频软件,我使用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进行更异步的操作。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- C++,系统无法执行指定的程序
- 使用C++中的模板和运算符重载执行矩阵运算
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何仅为一个函数添加延迟
- 执行函数时导致崩溃的变量
- 无论条件是否为true,if总是在c++中执行
- 将自定义函数传递到基抽象类中以延迟执行
- 异步 60 秒延迟后C++执行函数?
- 如果 QApplication 执行延迟,QWebEngineView 在加载内容时会以静默方式失败
- C++11 延迟执行的"correct"方法
- 在vsync打开的情况下执行glTexImage2D时出现奇怪的延迟
- Lua/C++/luabind /与其他 lua 行为脚本交互中成员函数的执行延迟
- 有没有办法创建一个线程,但在不使用运算符的情况下使用 C++11 延迟它的执行=
- 在不使用睡眠的情况下在延迟之后执行C++中的函数
- 在程序继续执行的同时,如何使代码的两部分之间存在时间间隔或延迟?C++
- 延迟执行1秒
- 在c++中增加代码执行延迟
- 延迟执行代码
- 如何对接口的引用执行延迟计算(尝试使用bind)