我在Core Image
中运行了一个简单的NSOperation
过滤器。它大部分时间都可以工作,但是,它会偶尔崩溃(其余的代码永远不会崩溃而不会使用Core Image )。当它崩溃时,它总是具有指向MetalTools-[MTLDebugComputeCommandEncoder setSamplerState:atIndex:]
的相同回溯。
通常我只对每个图像运行一次滤镜,但是如果我将滤镜放在for循环中并且每个图像运行50次,它通常会在{{1}处理的第10和第20个图像之间崩溃。 }。但是反复运行会使崩溃在大多数情况下都是可重现的。
这是我的核心图像过滤器:
NSOperationQueue
当它崩溃时,它总是在调用func adjustImage(withSaturation saturation: Float, image: UIImage!) -> UIImage? {
let ciimage = CIImage.init(cgImage: image.cgImage!)
if self.isCancelled {return nil}
let filter = CIFilter.init(name: "CIColorControls")
filter?.setValue(ciimage, forKey: kCIInputImageKey)
filter?.setValue(saturation, forKey: kCIInputSaturationKey)
if self.isCancelled {return nil}
let result = filter?.value(forKey: kCIOutputImageKey) as! CIImage
if self.isCancelled {return nil}
let context = CIContext.init(options: nil)
if self.isCancelled {return nil}
//When it crashes, it always crashes on the following line:
if let cgimage = context.createCGImage(result, from: result.extent) {
if self.isCancelled {return nil}
let image = UIImage.init(cgImage: cgimage)
if self.isCancelled {return nil}
return image
}
return nil
}
context.createCGImage()
过滤器不是线程安全的吗?这就是它的样子。
这是回溯:
Core Image