Мне нужно улучшить мой метод drawRect. Это очень медленно. У меня 10 прозрачных png's, которые я хочу объединить вместе с различными режимами наложения. Я читал сообщение от Apple Developer Lib и от Stackoverflow.Как улучшить производительность drawRect для объединения разных UIImages вместе?
Теперь я хочу знать, как улучшить свой код и общую производительность чертежа. Не могли бы вы помочь? Загрузка всех этих изображений в цикл for делает его настолько медленным, не так ли? Как получить максимальную производительность?
- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
CGAffineTransform matrix =CGContextGetCTM(context);
CGAffineTransformInvert(matrix);
CGContextConcatCTM(context,matrix);
CGRect contentRect;
// load each UIImage
for (i=0; i< [configurationArray count]; i = i + 1) {
image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:imageName ofType:nil]];
contentRect = CGRectMake(x,y,image.size.width,image.size.height);
CGContextSetBlendMode (context, kCGBlendModeScreen);
CGContextSetAlpha (context, [layerData.layerAlpha floatValue]);
CGContextDrawImage (context,contentRect, image.CGImage);
}
}
UPDATE:
Теперь i'm с помощью CALayers поставить пиксель прямой на нужном положении. Но мне нужны разные режимы наложения, альфа и цветные заливки для каждого слоя. Есть ли способ избежать вызова дорогого метода «CGContextDrawImage» на каждом уровне? Например, я надеюсь, что его можно просто обновить контекст для небольшого размера определенного слоя, не так ли? Или мне нужно отображать весь UIView для каждого изменения контекста?
Я надеюсь, что кто-то может подтолкнуть меня в правильном направлении. Мне просто нужно учиться на эту тему. Спасибо за любую помощь.
- (void)drawRect:(CGRect)rect {
// load each UIImage
for (int i=0; i< [myArray count]; i++) {
image = [[ImageCache sharedImageCache] imageForKey:imageName];
CALayer* sublayer = [CALayer layer] ;
[sublayer setPosition:CGPointMake(image.size.width/2, image.size.height/2)];
[sublayer setFrame:CGRectMake(x, y, image.size.width, image.size.height)];
CGImageRef layerImage = [image CGImage];
[sublayer setContents:(__bridge id) layerImage];
[sublayer setBackgroundColor:[[UIColor clearColor] CGColor]];
[self.layer addSublayer:sublayer];
// How can i set the blend mode, color fill & alpha value without
// calling the expensive "CGContextDrawImage" ? Possible?
}
}
Возможно, вы не должны загружать десять изображений в '-drawRect:'. Сначала загрузите и кешируйте их где-то в другом месте. Однако будьте осторожны с использованием памяти с помощью множества изображений. –
Спасибо, Брэд. Я проверю это. Благодарю. – geforce
Это помогло мне получить более высокие частоты кадров, но из-за UIView 1024x600px, я надеюсь, что есть еще несколько способов улучшить его. Как насчет CALayers? Любые другие идеи, как получить больше FPS? – geforce