13

のタイルの束を生成していCATiledLayerます。iPhone4Sで4レベルの詳細を備えた256x256で120個のタイルを生成するのに約11秒かかります。画像自体は2048x2048の範囲内に収まります。

私のボトルネックはUIImagePNGRepresentationです。256 x 256の画像を生成するのに約0.10〜0.15秒かかります。

異なるバックグラウンドキューで複数のタイルを生成しようとしましたが、これでは約9〜10秒に短縮されます。

また、次のようなコードでImageIOフレームワークを使用してみました。

- (void)writeCGImage:(CGImageRef)image toURL:(NSURL*)url andOptions:(CFDictionaryRef) options
{
    CGImageDestinationRef myImageDest = CGImageDestinationCreateWithURL((__bridge CFURLRef)url, (__bridge CFStringRef)@"public.png", 1, nil);
    CGImageDestinationAddImage(myImageDest, image, options);
    CGImageDestinationFinalize(myImageDest);
    CFRelease(myImageDest);
}

これにより小さいPNGファイルが生成されますが(win!)、約13秒かかり、以前より2秒長くなります。

PNG画像をCGImageより高速にエンコードする方法はありますか?おそらく、 libjpeg-turboのNEONようにARM拡張機能(iPhone 3GS +)を利用するライブラリですか?

スペースをあまりとらないタイルを保存するために、PNGよりも優れたフォーマットはおそらくありますか?

私が思いついた唯一の実行可能なオプションは、タイルサイズを512 x 512に増やすことです。これにより、エンコード時間が半分に短縮されます。しかし、それが私のスクロールビューに何をするかはわかりません。このアプリはiPad2+用で、iOS 6のみをサポートします(ベースラインとしてiPhone 4Sを使用)。

4

1 に答える 1

4

で新しい画像を作成していると思っていたのに、毎回UIImageRepresentation元の画像を解凍していたため、パフォーマンスが低下したことがわかりました。CGImageCreateWithImageInRect

あなたはここで楽器からの結果を見ることができます:

ここに画像の説明を入力してください

通知_cg_jpeg_read_scanlinesdecompress_onepass

これで画像を強制的に解凍していました:

UIImage *image = [UIImage imageWithContentsOfFile:path];
UIGraphicsBeginImageContext(CGSizeMake(1, 1));
[image drawAtPoint:CGPointZero];
UIGraphicsEndImageContext();

このタイミングは約0.10秒で、各UIImageRepresentation呼び出しにかかる時間とほぼ同じです。

画像を強制的に解凍する方法として描画することを推奨するインターネット上の記事は数多くあります。

画像減圧症を回避するココアネティクスに関する記事があります。この記事では、画像を読み込む別の方法を紹介しています。

NSDictionary *dict = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES]
                                                 forKey:(id)kCGImageSourceShouldCache];
CGImageSourceRef source = CGImageSourceCreateWithURL((__bridge CFURLRef)[[NSURL alloc] initFileURLWithPath:path], NULL);
CGImageRef cgImage = CGImageSourceCreateImageAtIndex(source, 0, (__bridge CFDictionaryRef)dict);
UIImage *image = [UIImage imageWithCGImage:cgImage];
CGImageRelease(cgImage);
CFRelease(source);

そして今、同じプロセスは約3秒かかります!GCDを使用してタイルを並行して生成すると、時間が大幅に短縮されます。

上記のwriteCGImage機能は約5秒かかります。ファイルサイズが小さいので、zlib圧縮はより高いレベルにあると思います。

于 2013-01-02T03:41:54.237 に答える