iOS模拟器10.2.1上的模糊图像性能问题

iOS模拟器10.2.1上的模糊图像性能问题,ios,swift,ios-simulator,Ios,Swift,Ios Simulator,我使用此代码模糊我的UIImage extension UIImage { func blurred(radius: CGFloat) -> UIImage { let ciContext = CIContext(options: nil) guard let cgImage = cgImage else { return self } let inputImage = CIImage(cgImage: cgImage)

我使用此代码模糊我的
UIImage

extension UIImage {
    func blurred(radius: CGFloat) -> UIImage {
        let ciContext = CIContext(options: nil)
        guard let cgImage = cgImage else { return self }
        let inputImage = CIImage(cgImage: cgImage)
        guard let ciFilter = CIFilter(name: "CIGaussianBlur") else { return self }
        ciFilter.setValue(inputImage, forKey: kCIInputImageKey)
        ciFilter.setValue(radius, forKey: "inputRadius")
        guard let resultImage = ciFilter.value(forKey: kCIOutputImageKey) as? CIImage else { return self }
        guard let cgImage2 = ciContext.createCGImage(resultImage, from: inputImage.extent) else { return self }
        return UIImage(cgImage: cgImage2)
    }
}
但是从这个操作返回图像需要很长时间

实际上,此操作大约需要2秒钟:
guard let cgImage2=ciContext.createCGImage(resultImage,from:inputImage.extent)else{return self
}


我还没有在真正的设备上测试过它,但不确定代码是否有效

代码看起来很好,尽管您应该缓存它返回的图像,而不是尽可能重复调用它;正如Matt在下面的评论中指出的,您还应该使用共享的CIContext,而不是每次都设置一个新的CIContext


您看到的性能问题是由于模拟器具有与实际硬件截然不同的性能特征。听起来核心映像要么使用模拟器的模拟OpenGL ES接口(速度较慢),要么使用CPU(速度较慢)。在iOS设备上测试它会让您更好地了解您应该期望的性能。

您应该缓存上下文。创建一个新的CIContext是昂贵的。我对@matt comment投了赞成票-这个答案部分是有帮助的,因为CI的模拟器性能是可怜的。但您可能应该补充一点,忽略创建多个
cicontext
的含义是多么错误。老实说,我期待(希望?)WWDC19能对CoreImage在模拟器中的运行方式带来一些急需的改变。。。对于GLKit的弃用和Marzipan等要求,他们至少可以让金属“原生”到它身上。好消息:对于iOS 13+Xcode 11+macOS 10.15,CoreImage在模拟器中使用金属,并且是由GPU加速的硬件。另外,我不会永远保留
CIContext()
,否则您可能会消耗大量纹理内存并被终止。