当我用Shader Storage Buffer Object调用GetBufferSubData时,通常有4ms的延迟。我的申请可以在这段时间内工作吗?
// start GetBufferSubData
// do client/app/CPU work
// (wait if needed)
// read results from GetBufferSubData
或者使用某种API来异步地从GPU开始复制缓冲区数据?
我能够使用glMapBufferRange
和GL_MAP_PERSISTENT_BIT
获得异步读回工作。然而,当在该缓冲区上运行计算着色器(多次背靠背)时,与没有持久映射相比,这会导致巨大的性能下降。
简单地用GL_MAP_PERSISTENT_BIT
标记缓冲区的问题是,当在该缓冲区上运行计算着色器(使用Nvidia Nsight Graphics进行分析)时,这会导致实质性的性能下降(慢8倍)。我怀疑这是因为映射,OpenGL需要读/写缓冲区到不同的位置,在GPU上性能较差,但CPU更高性能/可访问。
我的解决方案是创建一个小得多的缓冲区(小1000倍,16kb),它被持久化映射,CPU可以使用它在需要时以小增量读/写更大的缓冲区。这种组合要快得多,而且只需要很少的API开销就能满足我的需求。