使用多个PBO从opengl前端缓冲区异步回读

时间:2010-04-18 10:41:32

标签: opengl

我正在开发一个需要从openGL应用程序的前端缓冲区读回整个帧的应用程序。我可以劫持应用程序的opengl库并在swapbuffers上插入我的代码。目前,我成功地使用了一个简单但令人难以忍受的慢速glReadPixels命令而没有PBO。

现在我读到了使用多个PBO来加快速度。虽然我认为我已经找到了足够的资源来实际编程(并不是那么难),但我还是有一些操作性问题。我会做这样的事情:

  1. 创建一系列(例如3)PBO的
  2. 在我的swapBuffers覆盖中使用glReadPixels将数据从前缓冲区读取到PBO(应该快速且无阻塞,对吗?)
  3. 创建一个单独的线程来调用glMapBufferARB,在glReadPixels之后每个PBO调用一次,因为这将阻塞,直到像素在客户端内存中。
  4. 处理步骤3中的数据。
  5. 现在我的主要关注点当然是步骤2和3.我读到关于PBO上使用的glReadPixels是非阻塞的,如果我在那之后发出新的opengl命令会是一个问题吗?那些opengl命令会阻塞吗?或者他们会继续(我的猜测),如果是这样,我猜只有交换缓冲区可能是一个问题,这一个停止或将来自前缓冲区的glReadPixels比交换快几倍(大约每15-> 30ms)或最差案例场景,当glReadPixels仍在向PBO读取数据时,是否会执行swapbuffers?我目前的猜测是这个逻辑会做这样的事情:复制FRONT_BUFFER - > VRAM中的通用位置,复制VRAM-> RAM。但我不知道这两个中哪一个是真正的瓶颈还有更多,对普通opengl命令流的影响是什么。

    然后在第3步中。在与普通opengl逻辑分离的线程中异步执行此操作是否明智?目前我认为不是,在执行此操作后,您似乎必须将缓冲区操作恢复到正常状态,并且我无法在原始代码中安装同步对象以暂时阻止这些操作。所以我认为我最好的选择是在读出它们之前定义一个特定的swapbuffer延迟,例如在PBO i%3上调用glReadPixels,在同一线程中调用PBO(i + 2)%3上的glMapBufferARB,导致2帧的延迟。另外,当我调用glMapBufferARB来使用客户端内存中的数据时,这会成为瓶颈还是glReadPixels(异步)成为瓶颈?

    最后,如果你有更好的想法来加速opengl中GPU的帧回读,请告诉我,因为这是我当前系统中一个痛苦的瓶颈。

    我希望我的问题很清楚,我知道答案可能也会出现在互联网上,但我主要想出的结果是使用PBO将缓冲区保存在视频内存中并在那里进行处理。我真的需要将前缓冲区读回RAM并且我没有找到关于性能的明确解释(我需要,我不能依赖“它更快”,我需要解释为什么它更快)。

    谢谢

1 个答案:

答案 0 :(得分:3)

您确定要从前台缓冲区读取吗?你不拥有这个缓冲区,并且根据你的操作系统,它可能会被破坏,例如,通过它上面的另一个窗口。

对于您的用例,人们通常会这样做

  • 画N
  • 启动PBO从后台缓冲区读取N
  • 画N + 1
  • 启动PBO读取N + 1
  • 同步PBO读取N
  • 处理N
  • ...

来自单个帖子。