我正在开发一个需要从openGL应用程序的前端缓冲区读回整个帧的应用程序。我可以劫持应用程序的opengl库并在swapbuffers上插入我的代码。目前,我成功地使用了一个简单但令人难以忍受的慢速glReadPixels命令而没有PBO。
现在我读到了使用多个PBO来加快速度。虽然我认为我已经找到了足够的资源来实际编程(并不是那么难),但我还是有一些操作性问题。我会做这样的事情:
现在我的主要关注点当然是步骤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并且我没有找到关于性能的明确解释(我需要,我不能依赖“它更快”,我需要解释为什么它更快)。
谢谢
答案 0 :(得分:3)
您确定要从前台缓冲区读取吗?你不拥有这个缓冲区,并且根据你的操作系统,它可能会被破坏,例如,通过它上面的另一个窗口。
对于您的用例,人们通常会这样做
来自单个帖子。