【问题标题】:Strange delay when executing glTexImage2D with vsync on使用 vsync 执行 glTexImage2D 时出现奇怪的延迟
【发布时间】:2013-11-19 13:45:24
【问题描述】:

我正在编写一个视频软件,我使用 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。我希望尽可能减少延迟,所以有人可以解释这里发生了什么吗?

【问题讨论】:

  • 不要使用双精度版本的 GL API 调用。授予立即模式一开始不会给您带来合理的性能,但是让驱动程序无缘无故地从双精度转换为单精度同样是糟糕的形式。 GL 通过提供双精度 API 函数创造了整个管道支持双精度的错觉,但在大多数硬件和 GL 实现上,这与事实相差甚远……请改用 glTexCoord2fglVertex2f

标签: c++ qt opengl vsync


【解决方案1】:

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

【讨论】:

  • glTexSubImage2D 也需要 1ms 到 16ms 来执行,就像等待 VBLANK 一样。我不认为这里的问题是 glTexImage2D 是一个昂贵的电话。似乎 glTexImage2D/glTexSubImage2D 是垂直同步的,虽然我只想让 updateGL 垂直同步。
猜你喜欢
  • 1970-01-01
  • 2012-01-01
  • 1970-01-01
  • 2020-11-14
  • 1970-01-01
  • 2017-10-28
  • 1970-01-01
  • 2016-03-14
  • 2011-09-04
相关资源
最近更新 更多