iPad 3のiOSで画像を描画するための最も最適化された方法を見つけようとしています。アプリに実装している、サードパーティバージョンのCoverflowのリフレクションを生成しています。リフレクションはNSOperationQueueを使用して作成され、メインスレッドのUIImageViewを介して追加されます。カバーフロー部分は、画像をスクロールするときにアニメーションのリソースをすでに使用しているため、新しい画像が追加されるたびに、スクロールに少し「ポップ」が発生し、アプリがラグ/グリッチのように感じられます。iPad 1および2でのテストでは、アニメーションは完全にスムーズで見栄えがします。
これを回避するために、どうすれば図面をさらに最適化できますか。どんなアイデアでも大歓迎です。一度に少しの反射が現れるように反射を「タイリング」することを検討してきましたが、最善のアプローチが何であるかはわかりません。
描画コードは次のとおりです。
UIImage *mask = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@"3.0-Carousel-Ref-Mask.jpg" ofType:nil]];
//
UIImage *image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle]pathForResource:self.name ofType: nil]];
UIGraphicsBeginImageContextWithOptions(mask.size, NO, [[UIScreen mainScreen]scale]);
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(ctx, 0.0, mask.size.height);
CGContextScaleCTM(ctx, 1.f, -1.f);
[image drawInRect:CGRectMake(0.f, -mask.size.height, image.size.width, image.size.height)];
UIImage *flippedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
CGImageRef maskRef = mask.CGImage;
CGImageRef maskCreate = CGImageMaskCreate(CGImageGetWidth(maskRef),
CGImageGetHeight(maskRef),
CGImageGetBitsPerComponent(maskRef),
CGImageGetBitsPerPixel(maskRef),
CGImageGetBytesPerRow(maskRef),
CGImageGetDataProvider(maskRef), NULL, false);
CGImageRef masked = CGImageCreateWithMask([flippedImage CGImage], maskCreate);
CGImageRelease(maskCreate);
UIImage *maskedImage = [UIImage imageWithCGImage:masked scale:[[UIScreen mainScreen]scale] orientation:UIImageOrientationUp];
CGImageRelease(masked);
if (maskedImage) {
[mainView performSelectorOnMainThread:@selector(imageDidLoad:)
withObject:[NSArray arrayWithObjects:maskedImage, endView, nil]
waitUntilDone:YES];
} else
NSLog(@"Unable to find sample image: %@", self.name);
マスクは、画像をマスクするために使用しているグラデーションpngです。また、これを画面外に描画するだけで追加しない場合でも、ほとんど遅れはありません。ラグは、実際にメインスレッドに追加することで発生します。