并行化GPU& CPU使用GPUImage

时间:2013-12-24 20:47:59

标签: ios gpgpu gpuimage

我正在尝试在iOS上使用GPUImage编写视频过滤应用程序。通常,我的处理链看起来像:

GPUImageVideoCamera->CustomFilter->[CPU processing block]

CPU处理块的外观如下:

{
     glReadPixels(...)
     do_some_processing()
}

我目前在iPad上的表现是5-7 FPS,我正在努力改进。

我知道应该使用GPUImageRawDataInput而不是glReadPixels,但我的问题是是否有一种方法/代码示例来并行化CPU和GPU工作,以便GPU正在处理帧N,CPU将处理帧N-1。

1 个答案:

答案 0 :(得分:3)

我知道你已经知道了,但我仍然建议使用GPUImageRawDataOutput来提取原始像素数据。原因是您可以设置每次新视频帧可用时触发newFrameAvailableBlock。该块从视频处理队列运行,该队列在后台线程上运行。我使用后台队列进行视频处理,它已经并行化了CPU和GPU之间的一些工作。

在此块中,您可以在第二个后台队列上触发另一个异步块。这将导致这个CPU绑定块与GPUImage队列并行运行。

但是,如果GPUImage可以比CPU绑定处理更快地处理帧,那么您将需要应用某种速率限制,以防止CPU块在第二个队列中累积。当我的处理无法跟上时,我使用dispatch semaphore来删除帧。

除非您在GPUImage中运行非常密集的着色器,否则通过并行化可能不会对性能提升产生太大影响,但这很容易尝试。