我编写了一个自己的 CIFilter 内核,它正在对相机信号进行一些图像处理。它需要两个参数:参数一个是“inputImage”(当前相机图像),参数 2 是“backgroundImage”,它正在使用第一个相机图像进行初始化。
过滤器应该递归工作。过滤器的结果应在下一次迭代中用作新的“背景图像”。我正在计算背景图像和一些差异,因此需要上一次渲染的结果。
不幸的是,我不能在下一次迭代中使用 CIFilter 的输出 CIImage,因为内存负载越来越大。经过 10 秒的处理后,最终使用了 1.4GB 的 RAM。以标准方式(无递归)内存管理使用过滤器很好。
如何在下一次迭代中重用过滤器的输出作为输入?我在结果图像上做了一个 NSLog。蚂蚁告诉我
background {
CISampler:0x1002e0360 image {
FEPromise: 0x1013aa230 extent [0 0 1280 720]; DOD [0 0 1280 720]; filter MyFeatureDetectFilter: 0x101388dd0; kernel coreImageKernel; image {
CISampler:0x10139e200 image {
FEBufferImage: 0x10139bee0 metadata.colorspace: HDTV; extent: [0 0 1280 720]; format: BGRA_8; uid 5
}
几秒钟后,日志变成了某事。像
}
}
}
}
}
这告诉我 CIImages 是所需操作的“始终”原型。并且递归地使用它们将“生成的 CIImage '原型'”作为输入添加到新的“原型”中。随着时间的推移,渲染的“规则”变成了一个巨大的嵌套原型结构。
有什么方法可以强制 CIImages 将内存中的结构变平?如果我可以进行递归处理,我会很高兴,因为这会将 QuartzCore 的功能发挥到极致。
我在 QuartzComposer 中尝试了同样的方法。将输出与输入连接是可行的,但也会占用大量内存。一段时间后它崩溃了。然后我尝试使用 QC 的队列,一切正常。QC 队列的“xcode”等价物是什么?或者是否有任何机制可以重写我的内核以将“结果”保存在内存中以供下一次迭代使用?