0

我正在尝试找到在 iPad 3 上的 iOS 中绘制图像的最优化方法。我正在为我在我的应用程序中实现的第三方版本的coverflow 生成反射。反射是使用 NSOperationQueue 创建的,然后在主线程中通过 UIImageView 添加。因为当您滚动浏览图像时,coverflow 部分已经在使用动画资源,因此添加的每个新图像都会在滚动中出现一点“弹出”,这让应用程序感觉有点迟钝/故障。在 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。另外,如果我只是在屏幕外绘制但不添加它,则几乎没有任何滞后。滞后来自于在主线程上实际添加它。

4

1 回答 1

0

因此,在花费大量时间研究这个问题并尝试不同的方法(并在 Instruments 中使用“时间”分析器花费了很长时间)之后,我发现延迟来自图像在主线程上的图像解码显示。通过使用所有 CoreGraphics 调用在后台解码,我能够将时间缩短一半。这还不够好。

我进一步发现,由于透明度或 alpha 像素,在我的代码中创建的反射需要很长时间才能显示。因此,我在上下文中绘制了它,并用纯黑色填充了上下文。然后我使视图本身透明而不是图像。这将它在主线程上花费的时间减少了 83%——任务完成

于 2012-10-24T14:53:56.957 回答