iOS 模拟器 10.2.1 上的模糊图像性能问题
Blur image performance issues on iOS simulator 10.2.1
我用这段代码来模糊我的 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)
}
}
但是从这个操作到 return 图像需要很长时间。
实际上这个操作大约需要 2 秒:
guard let cgImage2 = ciContext.createCGImage(resultImage, from: inputImage.extent) else { return self
}
我没有在真实设备上测试过,但不确定代码是否有效
该代码看起来 fine-ish,尽管您应该将图像缓存它 returns 而不是尽可能重复调用它;正如 Matt 在下面的评论中指出的那样,您还应该使用共享的 CIContext 而不是每次都设置一个新的。
您看到的性能问题是由于模拟器的性能特征与真实硬件有很大不同。听起来 Core Image 要么使用模拟器的模拟 OpenGL ES 接口(速度较慢),要么使用 CPU(速度较慢)。在 iOS 设备上对其进行测试会让您更好地了解您应该期望的性能。
我用这段代码来模糊我的 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)
}
}
但是从这个操作到 return 图像需要很长时间。
实际上这个操作大约需要 2 秒:
guard let cgImage2 = ciContext.createCGImage(resultImage, from: inputImage.extent) else { return self
}
我没有在真实设备上测试过,但不确定代码是否有效
该代码看起来 fine-ish,尽管您应该将图像缓存它 returns 而不是尽可能重复调用它;正如 Matt 在下面的评论中指出的那样,您还应该使用共享的 CIContext 而不是每次都设置一个新的。
您看到的性能问题是由于模拟器的性能特征与真实硬件有很大不同。听起来 Core Image 要么使用模拟器的模拟 OpenGL ES 接口(速度较慢),要么使用 CPU(速度较慢)。在 iOS 设备上对其进行测试会让您更好地了解您应该期望的性能。