Я создаю кучу фрагментов для CATiledLayer
. Требуется около 11 секунд, чтобы создать 120 плит с 256 x 256 с 4 уровнями детализации на iPhone 4S. Само изображение соответствует 2048 x 2048.
Мое узкое место 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 (выигрыш!), это занимает около 13 секунд, что на 2 секунды больше, чем раньше.
Есть ли способ быстрее закодировать изображение PNG из CGImage
? Возможно, библиотека, использующая расширение NEON
ARM (iPhone 3GS +), например libjpeg-turbo, делает?
Возможно, лучший формат, чем PNG для сохранения плиток, которые не занимают много места?
Единственный жизнеспособный вариант, который я смог придумать, - увеличить размер плитки до 512 x 512. Это сокращает время кодирования наполовину. Не уверен, что это будет делать с моим просмотром прокрутки. Приложение предназначено для iPad 2+ и поддерживает только iOS 6 (используя iPhone 4S в качестве базовой линии).