当我使用着色器存储缓冲对象调用GetBufferSubData时,通常会有4ms的延迟。我的应用程序在这段时间内是否可以工作?
// start GetBufferSubData
// do client/app/CPU work
// (wait if needed)
// read results from GetBufferSubData
或者使用某种API从GPU异步开始复制缓冲区数据?
我可以使用glMapBufferRange
和GL_MAP_PERSISTENT_BIT
进行异步回读。但是,当在该缓冲区上运行计算着色器(多次背靠背)时,与没有持久Map相比,这会导致性能大幅下降。
1条答案
按热度按时间0vvn1miw1#
简单地将缓冲区标记为
GL_MAP_PERSISTENT_BIT
的问题是,当在该缓冲区上运行计算着色器(使用Nvidia Nsight Graphics分析)时,这会导致性能大幅下降(慢8倍)。我怀疑这是因为Map,OpenGL需要将缓冲区读/写到另一个位置,该位置在GPU上性能较低,但在CPU上性能更高/更易访问。我的解决方案是创建一个小得多的缓冲区(小1000倍,16 kb),该缓冲区被永久Map,CPU可以使用该缓冲区在需要时以较小的增量读/写较大的缓冲区。这种组合速度快得多,仅需要很小的API开销就能满足我的需求。