glBufferStorage + glGetBufferSubData用于检索数据

时间:2017-01-08 23:46:39

标签: c++ opengl

我有compute shader包含算法。

  • CPU GPU 共同以交替的方式解决任务(cpu - > gpu - > cpu - > gpu)。
  • 在每次绘制调用中,我需要多次从 GPU 下载数据。
  • 通过shader storage buffers进行沟通。

在我尝试之前

  • glBufferData + glMapBufferRange(..., GL_MAP_READ_BIT)

但是,我只实现了 32 ms /帧,其中很多时间用于通信。

现在我试过

  • glBufferStorage + glGetBufferSubData

它仍然只能 32 ms /帧

我做错了吗?如果我关闭通信并使用虚拟值计算,则性能会跳转到 18 ms /帧。知道如何改善时机吗?

1 个答案:

答案 0 :(得分:0)

glMapBufferRange(...,GL_MAP_READ_BIT)和glGetBufferSubData()都隐式地执行类似于glFinish()的操作,这对性能不是很好。您可以通过持久映射SSBO并将CPU处理移动到其他线程来避免这种情况。主GL线程和CPU处理一个将与glFenceSync()/ glWaitSync()/ glClientWaitSync()同步。

查看this forum post讨论类似问题。