opengl 异步SSBO回读

i1icjdpr  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(167)

当我使用着色器存储缓冲对象调用GetBufferSubData时,通常会有4ms的延迟。我的应用程序在这段时间内是否可以工作?

// start GetBufferSubData
// do client/app/CPU work
// (wait if needed)
// read results from GetBufferSubData

或者使用某种API从GPU异步开始复制缓冲区数据?
我可以使用glMapBufferRangeGL_MAP_PERSISTENT_BIT进行异步回读。但是,当在该缓冲区上运行计算着色器(多次背靠背)时,与没有持久Map相比,这会导致性能大幅下降。

0vvn1miw

0vvn1miw1#

简单地将缓冲区标记为GL_MAP_PERSISTENT_BIT的问题是,当在该缓冲区上运行计算着色器(使用Nvidia Nsight Graphics分析)时,这会导致性能大幅下降(慢8倍)。我怀疑这是因为Map,OpenGL需要将缓冲区读/写到另一个位置,该位置在GPU上性能较低,但在CPU上性能更高/更易访问。
我的解决方案是创建一个小得多的缓冲区(小1000倍,16 kb),该缓冲区被永久Map,CPU可以使用该缓冲区在需要时以较小的增量读/写较大的缓冲区。这种组合速度快得多,仅需要很小的API开销就能满足我的需求。

相关问题