我正在使用OpenGL进行某些GPGPU处理。因此,我有不同的线程来处理OpenGL处理线程。
在每个“工作项”之后,我需要调用glReadPixels和glMapBuffer以便将数据从PBO传输回主机。但是,这样做的问题是glMapBuffer会阻塞线程,并且即使GPU处于空闲状态,在DMA传输完成之前也无法完成任何有用的工作。解决此问题的常用方法是创建一个具有最长DMA传输时间深度的管道。但是,当我在低延迟系统上工作时,这不是最佳选择。
有没有一种方法可以让在单独的线程上等待glMapBuffer,或者获得有关DMA传输何时完成的通知,以便尽可能减少延迟?
最佳答案
除了glMapBuffer块之外,其他线程还有其他工作吗?您可以有多个OpenGL上下文,每个上下文都在其自己的线程中处于 Activity 状态。如果将它们配置为共享对象,则它们可以同时运行。
但是,DMA实际上意味着要为GPU工作,至少要充分消耗它的带宽,因此最终可能会获得更差的性能。