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

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

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

  • 现在,我的主要关注点当然是在第2步和第3步中。我了解了在PBO处于非阻塞状态时使用的glReadPixels,如果我很快之后发出新的opengl命令,这会成为问题吗?这些opengl命令会阻止吗?还是它们会继续(我猜),如果是这样,我想只有swapbuffers可能是个问题,这会停顿还是将前缓冲区的glReadPixels比swapping(大约每15-> 30ms)快很多倍,或者最坏的情况在这种情况下,在glReadPixels仍在向PBO读取数据时会执行交换缓冲区吗?我目前的猜测是此逻辑将执行以下操作:复制FRONT_BUFFER-> VRAM中的通用位置,复制VRAM-> RAM。但是我不知道这2个是真正的瓶颈,更不知道对正常的opengl命令流有什么影响。

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

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

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

    谢谢

    最佳答案

    您确定要从前端缓冲区读取吗?您不拥有此缓冲区,并且取决于您的操作系统,它可能会被(例如)其顶部的另一个窗口破坏。

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

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

  • 从单个线程。

    10-08 08:29