12

나는 CATiledLayer에 대해 타일 묶음을 생성 중입니다. iPhone 4S에서 4 레벨 디테일로 256 x 256 크기의 120 타일을 생성하는 데 약 11 초가 소요됩니다. 내 병목 현상 UIImagePNGRepresentation입니다UIImagePNGRepresentation보다 빠르게 PNG를 인코딩하는 방법은 무엇입니까?

2048 X 2048 내 이미지 자체는 맞습니다. 256x256 이미지를 생성하는 데 약 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 파일을 (승리!), 그것은 약 13 초 전에 2 초 이상 소요 생성하는 동안.

빠른 CGImage에서 PNG 이미지를 인코딩하는 방법은 없나요? 아마도 libjpeg-turbo과 같이 NEON ARM 확장 (iPhone 3GS +)을 사용하는 라이브러리는 무엇입니까?

아마도 많은 공간을 차지하지 않는 타일을 저장하는 PNG보다 더 나은 형식이 있습니까?

내가 가지고 올 수 있었던 유일한 가능한 옵션은 512 X 512이 반으로 인코딩 시간을 절감하여 타일의 크기를 증가시키는 것이다. 그래도 내 스크롤보기에 어떤 영향을 미치는지 확신 할 수 없습니다. 이 앱은 iPad 2 이상을 지원하며 iOS 6 (iPhone 4S를 기준으로 사용) 만 지원합니다.

답변

4

그것은 원래 이미지 에게 내가 CGImageCreateWithImageInRect으로 새로운 이미지를 생성 한 생각도 나는 비록 때마다을 압축 해제 되었기 때문에 UIImageRepresentation 이렇게 실적이 저조이었다 이유를 밝혀졌습니다.

현재 인스트루먼트의 결과를 볼 수 있습니다

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 압축이 더 높은 수준으로 판단됩니다.