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

Kil*_*nDS 5 opengl

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

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

  1. 创建一系列(例如3)PBO
  2. 在我的swapBuffers覆盖中使用glReadPixels将数据从前缓冲区读取到PBO(应该快速且无阻塞,对吧?)
  3. 创建一个单独的线程来调用glMapBufferARB,在glReadPixels之后每个PBO调用一次,因为这将阻塞,直到像素在客户端内存中.
  4. 处理步骤3中的数据.

现在我主要关心的是步骤2和3.我读到关于PBO上使用的glReadPixels是非阻塞的,如果我在那之后发出新的opengl命令会是一个问题吗?那些opengl命令会阻塞吗?或者他们会继续(我的猜测),如果是这样,我猜只有交换缓冲区可能是一个问题,这一个停止或将来自前缓冲区的glReadPixels比交换快几倍(大约每15-> 30ms)或最坏的情况下在glReadPixels仍在向PBO读取数据时,是否会执行swapbuffers?我目前的猜测是这个逻辑会做这样的事情:复制FRONT_BUFFER - > VRAM中的通用位置,复制VRAM-> RAM.但我不知道这两个中哪一个是真正的瓶颈还有更多,对普通opengl命令流的影响是什么.

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

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

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

谢谢

eil*_*ile 4

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

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

  • 启动PBO从后台缓冲区读取N
  • 抽N+1
  • 启动PBO读取N+1
  • 同步PBO读取N
  • 进程N
  • ...

来自单个线程。