我正在尝试在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。
答案 0 :(得分:3)
我知道你已经知道了,但我仍然建议使用GPUImageRawDataOutput来提取原始像素数据。原因是您可以设置每次新视频帧可用时触发newFrameAvailableBlock
。该块从视频处理队列运行,该队列在后台线程上运行。我使用后台队列进行视频处理,它已经并行化了CPU和GPU之间的一些工作。
在此块中,您可以在第二个后台队列上触发另一个异步块。这将导致这个CPU绑定块与GPUImage队列并行运行。
但是,如果GPUImage可以比CPU绑定处理更快地处理帧,那么您将需要应用某种速率限制,以防止CPU块在第二个队列中累积。当我的处理无法跟上时,我使用dispatch semaphore来删除帧。
除非您在GPUImage中运行非常密集的着色器,否则通过并行化可能不会对性能提升产生太大影响,但这很容易尝试。