我正在开发一个需要从openGL应用程序的前端缓冲区读回整个帧的应用程序。我可以劫持应用程序的opengl库,并将代码插入swapbuffers上。目前,我已经成功地使用了一个简单但令人费解的缓慢的glReadPixels命令,而没有PBO。
现在,我读到有关使用多个PBO加快速度的信息。虽然我认为我已经找到了足够的资源来进行实际编程(并不难),但我还有一些操作问题。我会做这样的事情:
现在,我的主要关注点当然是在第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,并且在这种情况下我没有找到任何有关性能的清晰解释(我需要,我不能依靠“它更快”,我需要解释为什么它更快)。
谢谢
最佳答案
您确定要从前端缓冲区读取吗?您不拥有此缓冲区,并且取决于您的操作系统,它可能会被(例如)其顶部的另一个窗口破坏。
对于您的用例,人们通常会做
从单个线程。