Мне удалось улучшить производительность, выполнив несколько вещей:
Я исправил процесс сборки так, что PNG оптимизировались под iOS.(Контент для приложения управляется в отдельном проекте, который выводит пакет. Настройки пакета по умолчанию относятся к пакету OS X, который не оптимизирует PNG).
Нафоновый поток I:
- Создание нового контекста растрового изображения (код ниже)
- Создание изображения PNG в контексте растрового изображения
- Создание CGImageRef из контекста растрового изображения
- Установить
layer.content
в главном потоке для CGImageRef
Использовать NSOperationQueue
для управления операциями.
Я уверен, что есть лучший способ сделать это, но приведенные выше результаты приводят к приемлемой производительности.
-(CGImageRef)newCGImageRenderedInBitmapContext //this is a category on UIImage
{
//bitmap context properties
CGSize size = self.size;
NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel * size.width;
NSUInteger bitsPerComponent = 8;
//create bitmap context
unsigned char *rawData = malloc(size.height * size.width * 4);
memset(rawData, 0, size.height * size.width * 4);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(rawData, size.width, size.height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
//draw image into bitmap context
CGContextDrawImage(context, CGRectMake(0, 0, size.width, size.height), self.CGImage);
CGImageRef renderedImage = CGBitmapContextCreateImage(context);
//tidy up
CGColorSpaceRelease(colorSpace);
CGContextRelease(context);
free(rawData);
//done!
//Note that we're not returning an autoreleased ref and that the method name reflects this by using 'new' as a prefix
return renderedImage;
}