我的UICollectionView
应用程序中有一个,其单元格主要由UIImageView
s 组成,其中包含已使用 Core Image 操作以降低色彩饱和度的图像。滚动时的性能绝对是可怕的。当我分析它时,花费的大部分时间(80% 左右)不在我的代码中,甚至不在我的堆栈中。这一切似乎都在核心动画代码中。可能有人知道为什么会这样吗?
在我的UICollectionViewCell
子类中,我有这样的东西:
UIImage *img = [self obtainImageForCell];
img = [img applySaturation:0.5];
self.imageView.image = img;
applySaturation
看起来像这样:
CIImage *image = [CIImage imageWithCGImage:self.CGImage];
CIFilter *filter = [CIFilter filterWithName:@"CIColorControls"];
[filter setValue:image forKey:kCIInputImageKey];
[filter setValue:[NSNumber numberWithFloat:saturation] forKey:@"inputSaturation"];
return [UIImage imageWithCIImage:filter.outputImage];
我唯一的猜测是 Core Animation 不能很好地与 Core Image 配合使用。Apple 文档这样说CIImage
:
尽管 CIImage 对象具有与之关联的图像数据,但它不是图像。您可以将 CIImage 对象视为图像“配方”。CIImage 对象具有生成图像所需的所有信息,但 Core Image 不会真正渲染图像,直到被告知这样做。这种“惰性评估”方法允许 Core Image 尽可能高效地运行。
在制作动画的最后一刻进行此评估可能会很棘手。