ios CIFilter在表格视图中显示多个灰度图像的性能如何?

6ju8rftf  于 2022-11-19  发布在  iOS
关注(0)|答案(1)|浏览(119)

在使用UIImageView在UITableView上显示图像之前,我使用以下方法将图像转换为灰度:

extension UIImage {
    var noir: UIImage? {
        let contextForGrayscale = CIContext(options: nil)
        guard let currentFilter = CIFilter(name: "CIPhotoEffectNoir") else { return nil }
        currentFilter.setValue(CIImage(image: self), forKey: kCIInputImageKey)
        if let output = currentFilter.outputImage,
            let cgImage = contextForGrayscale.createCGImage(output, from: output.extent) {
            return UIImage(cgImage: cgImage, scale: scale, orientation: imageOrientation)
        }
        return nil
    }
}

由于我使用UIImageView在UITableView中显示这些图像,所以随着用户滚动,每个图像都被灰度化。在我的iPhone 13上,性能似乎非常好,我没有看到任何延迟。但是,我很好奇它在旧设备上的性能有多好。我没有旧设备,所以我无法测试它。
1.这是一个性能的方式灰度飞行和显示他们?有什么我可以做的,使它更好?
1.有没有办法让我的手机变慢来测试性能?有点像模拟旧设备?

lf5gs5x2

lf5gs5x21#

如果性能/内存压力看起来不是问题,我就不担心它。如果是问题,你可以使用NSCache
我会在扩展之外进行缓存,但为了代码示例:

extension UIImage {
    
    private static var noirCache = NSCache<NSString, UIImage>()
    
    func makeNoirImage(identifier: String) -> UIImage? {
        if let cachedImage = UIImage.noirCache.object(forKey: identifier as NSString) {
          return cachedImage
        }
        
        let contextForGrayscale = CIContext(options: nil)
        guard let currentFilter = CIFilter(name: "CIPhotoEffectNoir") else { return nil }
        currentFilter.setValue(CIImage(image: self), forKey: kCIInputImageKey)
        if let output = currentFilter.outputImage,
            let cgImage = contextForGrayscale.createCGImage(output, from: output.extent) {
            
            let noirImage = UIImage(cgImage: cgImage, scale: scale, orientation: imageOrientation)
            UIImage.noirCache.setObject(noirImage, forKey: identifier as NSString)
        }
        return nil
    }
}

另外,请参阅本文https://nshipster.com/image-resizing/除了创建新图像之外,您还可以创建一个大小适合显示图像视图的缩略图,并为此使用内置的缓存机制。这将保存一些内存和整体性能。但是,如果这不是问题,我更希望代码更简单,并且没有缓存!
哦,还有一件事。你可以使用这个https://developer.apple.com/documentation/uikit/uitableviewdatasourceprefetching在单元格显示之前异步地提前创建图像,这样当表要求给定索引路径的单元格时,它就准备好了。仔细想想,这可能是这里最简单/最好的解决方案。

相关问题