12

Tôi đang tạo một loạt các ô xếp cho CATiledLayer. Mất khoảng 11 giây để tạo ra 120 ô ở 256 x 256 với 4 mức chi tiết trên iPhone 4S. Bản thân hình ảnh phù hợp trong phạm vi 2048 x 2048.Bất kỳ cách nào để mã hóa PNG nhanh hơn UIImagePNGĐại diện?

Nút cổ chai của tôi là UIImagePNGRepresentation. Nó mất khoảng 0,10-0,15 giây để tạo ra tất cả các hình ảnh 256 x 256.

Tôi đã thử tạo nhiều ô xếp trên hàng đợi nền khác nhau, nhưng điều này chỉ cắt giảm xuống còn khoảng 9-10 giây.

Tôi cũng đã thử bằng cách sử dụng khuôn khổ ImageIO với mã như thế này:

- (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); 
} 

Trong khi điều này tạo ra file PNG nhỏ hơn (giành chiến thắng!), Phải mất khoảng 13 giây, 2 giây hơn so với trước đây.

Có cách nào để mã hóa hình ảnh PNG từ CGImage nhanh hơn không? Có lẽ một thư viện sử dụng tiện ích mở rộng ARM NEON (iPhone 3GS +) như libjpeg-turbo?

Có lẽ định dạng nào tốt hơn PNG để lưu các ô không chiếm nhiều không gian?

Tùy chọn khả thi duy nhất mà tôi có thể đưa ra là tăng kích thước lát lên 512 x 512. Điều này làm giảm thời gian mã hóa một nửa. Bạn không chắc chắn điều gì sẽ làm cho chế độ xem cuộn của tôi. Ứng dụng này dành cho iPad 2+ và chỉ hỗ trợ iOS 6 (sử dụng iPhone 4S làm đường cơ sở).

Trả lời

4

Hóa ra lý do tại sao UIImageRepresentation được thực hiện rất kém là vì nó đã được giải nén hình ảnh ban đầu mỗi khi mặc dù tôi nghĩ tôi đã tạo ra một hình ảnh mới với CGImageCreateWithImageInRect.

Bạn có thể xem kết quả từ cụ ở đây:

enter image description here

Thông báo _cg_jpeg_read_scanlinesdecompress_onepass.

tôi lực giải nén hình ảnh với điều này:

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

Thời điểm này là khoảng 0,10 giây, gần như tương đương với thời gian thực hiện của mỗi UIImageRepresentation gọi.

Có rất nhiều bài viết trên internet đề xuất vẽ như một cách để giải nén hình ảnh.

Có một bài viết về Cocoanetics Avoiding Image Decompression Sickness. Bài viết cung cấp một cách khác để tải hình ảnh:

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); 

Và bây giờ quá trình tương tự mất khoảng 3 giây! Sử dụng GCD để tạo ra gạch song song làm giảm thời gian đáng kể hơn.

Chức năng writeCGImage ở trên mất khoảng 5 giây. Vì kích thước tệp nhỏ hơn, tôi nghi ngờ nén zlib ở mức cao hơn.

Các vấn đề liên quan