【问题标题】:glFlush() takes very long time on window with transparent backgroundglFlush() 在透明背景的窗口上花费很长时间
【发布时间】:2011-06-14 10:11:03
【问题描述】:

我使用How to make an OpenGL rendering context with transparent background? 中的代码创建了一个具有透明背景的窗口。我的问题是帧速率非常低 - 即使我绘制一个四边形(由 2 个三角形组成),我也有大约 20 帧/秒。我试图找出原因,而 glFlush() 大约需要 0.047 秒。你知道为什么吗?在 6000 fps(当我删除 60 fps 限制时)没有透明背景的窗口中呈现相同的东西。它还需要一个核心到 100%。我在 Q9450@2.66GHz 和 ATI Radeon 4800 上使用 Win7 对其进行了测试。

【问题讨论】:

  • 您是否考虑过使用双缓冲和SwapBuffers() 而不是glFlush()
  • 该技术不适用于渲染 OpenGL 动画,但它是我知道在 Vista 之前的 Windows 上绘制透明 OpenGL 窗口的唯一方法。这个页面有一个有趣的例子,你可以试着把它倒过来看看它是怎么做的:coreytabaka.com/programming/cube-demo

标签: windows winapi opengl


【解决方案1】:

我认为你不能通过这种方式获得良好的表现,在链接的示例中有以下代码

void draw(HDC pdcDest)
{
    assert(pdcDIB);
    verify(BitBlt(pdcDest, 0, 0, w, h, pdcDIB, 0, 0, SRCCOPY));
}

BitBlt 是在处理器上执行的函数,而 OpenGL 函数是由 GPU 执行的。因此从 GPU 渲染的数据要爬回主存,实际上从 GPU 到 CPU 的带宽是有限的(更因为数据要在 BitBlt'ed 后返回那里)。

如果您真的想要带有渲染内容的透明窗口,您可能想查看 Direct2D 和/或 Direct3D,也许有一些方法可以做到这一点,而不会因数据移动而造成性能损失。

【讨论】:

  • BitBlt 函数在 0(零)毫秒内执行。我不知道这是否是问题所在。我需要使用 OpenGL,因为我必须在其他平台上运行这个项目。
  • BitBlt 本身不是问题,但问题是它强制在 GPU 和主内存之间传输数据(这是瓶颈)。
猜你喜欢
  • 1970-01-01
  • 2012-12-27
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
相关资源
最近更新 更多