gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 19:28:58 26 4
gpt4 key购买 nike

我正在开发一个应用程序,需要从 openGL 应用程序的前端缓冲区读回整个帧。我可以劫持应用程序的 opengl 库并将我的代码插入交换缓冲区。目前,我成功地使用了一个简单但极其缓慢的 glReadPixels 命令,无需使用 PBO。

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

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

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

然后在步骤 3 中。在与正常 opengl 逻辑分离的线程中异步执行此操作是否明智?目前我认为不是,执行此操作后似乎必须将缓冲区操作恢复正常,并且我无法在原始代码中安装同步对象来暂时阻止这些操作。所以我认为我最好的选择是在读出它们之前定义一定的交换缓冲区延迟,例如在同一线程中调用 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
  • ...

来自单个线程。

关于opengl - 使用多个 PBO 从 opengl 前端缓冲区异步读回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2661936/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com