12

私はCATiledLayerのためのタイルの束を生成しています。 iPhone 4Sの4レベルのディテールで、256 x 256の120タイルを生成するのに約11秒かかります。画像自体は2048 x 2048に収まります。UIImagePNGRepresentationよりも速くPNGをエンコードする方法はありますか?

私のボトルネックは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ファイルを(勝つ!)生成するが、それは以前よりも2秒以上約13秒を取ります。

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

多くのスペースを消費しないタイルを保存するためにPNGよりも優れたフォーマットがありますか?

タイルサイズを512 x 512に増やすことができる唯一の実行可能なオプションは、エンコード時間を半減させます。しかし、それが私のスクロールビューに何をするか分からない。このアプリはiPad 2+用で、iOS 6(ベースラインとしてiPhone 4Sを使用)のみをサポートしています。それは、元の画像毎回を解凍したため

答えて

4

それは私がいてもUIImageRepresentationはそう悪くして行っていた理由が判明は私がCGImageCreateWithImageInRectで新しいイメージを作成していたを考えました。

現在の楽器からの結果を見ることができます:

enter image description here

お知らせ_cg_jpeg_read_scanlinesdecompress_onepassを。

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

このタイミングは各UIImageRepresentation呼び出しにかかる時間とほぼ同等の約0.10秒であった:I

本のイメージを力は、伸張しました。

画像を強制的に復元する方法として、インターネット上に多数の記事があります。

Cocoanetics Avoiding Image Decompression Sicknessに関する記事があります。この記事では、画像を読み込む別の方法を提供しています:

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圧縮はより高いレベルにあると思われます。

関連する問題