我正在尝试找到在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);
Mask只是我用来掩盖图像的渐变png。此外,如果我只是在屏幕外绘制但不添加它,几乎没有任何滞后。滞后来自实际在主线程上添加它。
答案 0 :(得分:0)
因此,经过花费大量时间研究这个问题并尝试不同的方法(并在仪器中花费了很长时间与“时间”分析器),我发现滞后来自主线程上的图像解码图像已显示。通过在所有CoreGraphics调用的背景上解码,我能够将时间缩短一半。这仍然不够好。
我进一步发现,由于透明度或alpha像素,我的代码中创建的反射需要很长时间才能显示。因此我将它绘制在一个上下文中,并用纯黑色填充上下文。然后我让视图本身透明而不是图像。这减少了主线程花费的时间83%-Mission Accompleished