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

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

最佳答案

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

关于c++ - 在打开 vsync 的情况下执行 glTexImage2D 时出现奇怪的延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20073214/

相关文章:

C++/OpenGL随机分割错误

C++:如何使 getter 和 setter 使用空构造函数

c++ - 阈值绝对值

c++ - 实现之间的随机输出不同

android - Qt5 (c++) android监听系统按钮

opengl - 为什么投影矩阵必须是双倍的?

c++ - 使用调试文件构建 C++ 项目

c++ - 无法从 qml 调用 C++ 方法 : "Property of object is not a function"

javascript - 如何动态更改 Flickable 的 contentHeight?

java - 在 Java 中使用代码块对性能有影响吗?