做工作而不是等待glMapBuffer

Do work instead of waiting for glMapBuffer

本文关键字:等待 glMapBuffer 工作      更新时间:2023-10-16

我正在使用OpenGL进行一些GPGPU处理。所以我有不同的线程为 OpenGL 处理线程提供服务。

在每个"工作项"之后,我需要调用glReadPixel和glMapBuffer,以便将数据从PBO传输回主机。然而,这样做的问题是glMapBuffer会阻塞线程,并且在DMA传输完成之前无法完成任何有用的工作,即使GPU处于空闲状态。解决此问题的常用方法是创建一个时间深度为最长 DMA 传输的管道。但是,由于我正在研究低延迟系统,因此这是次优的。

有没有办法在单独的线程上等待glMapBuffer,或者可能收到一些关于DMA传输何时完成的通知,以尽可能减少延迟?

在其他线程中做一些额外的工作,而不是一个glMapBuffer块?您可以有多个 OpenGL 上下文,每个上下文在自己的线程中处于活动状态;如果它们配置为共享对象,则可以同时操作。

然而,DMA实际上意味着GPU的工作,至少它的带宽被完全消耗,所以你最终可能会得到更差的性能。