我正在使用OpenGL进行一些GPGPU处理。所以我有不同的线程为OpenGL处理线程提供工作。
在每个“工作项”之后,我需要调用glReadPixels和glMapBuffer,以便将数据从PBO传回主机。然而,问题是glMapBuffer会阻塞线程,即使GPU处于空闲状态,在DMA传输完成之前也无法完成任何有用的工作。解决此问题的常用方法是创建具有最长DMA传输时间深度的管道。但是,由于我正在开发低延迟系统,因此这不是最理想的。
有没有办法可以在单独的线程上等待glMapBuffer ,或者可能会获得关于DMA传输何时完成的通知,以便减少延迟时间尽可能多?
答案 0 :(得分:2)
在glMapBuffer中阻塞的其他线程中做一些额外的工作吗?您可以拥有多个OpenGL上下文,每个上下文都在自己的线程中激活;如果他们被配置为共享对象,他们可以同时操作。
然而,DMA实际上意味着GPU的工作,至少它的带宽被完全消耗,因此你的性能可能会更差。