0

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です。また、これを画面外に描画するだけで追加しない場合でも、ほとんど遅れはありません。ラグは、実際にメインスレッドに追加することで発生します。

4

1 に答える 1

0

したがって、この問題の調査とさまざまなアプローチの試行に多くの時間を費やした後(そして、Instrumentsの「Time」プロファイラーでかなりの時間を費やした後)、画像が表示されます。すべてのCoreGraphics呼び出しでバックグラウンドでデコードすることにより、時間を半分に短縮することができました。これはまだ十分ではありませんでした。

さらに、コードで作成されている反射は、透明度またはアルファピクセルが原因で、表示に時間がかかることがわかりました。そのため、私はそれを文脈の中で描き、文脈を黒一色で塗りつぶしました。次に、画像ではなくビュー自体を透明にしました。これにより、メインスレッドにかかる時間が83%短縮されました—ミッション達成

于 2012-10-24T14:53:56.957 に答える