私はUICollectionView
自分のアプリに を持っています。そのセルは主に で構成されUIImageView
ており、Core Image で操作されて彩度が低くなった画像を含んでいます。スクロール時のパフォーマンスはまったくひどいものです。私がそれをプロファイリングすると、費やされた時間の大部分 (80% 程度) は、コードやスタックに含まれていません。すべて Core Animation コードにあるようです。なぜこれができるのか誰かが知っているでしょうか?
私の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 は可能な限り効率的に動作することができます。
アニメーションの最後の最後にこの評価を行うのは難しいかもしれません。