2012-04-05 2 views
1

Мне нужно улучшить мой метод 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? 

} 
} 
+1

Возможно, вы не должны загружать десять изображений в '-drawRect:'. Сначала загрузите и кешируйте их где-то в другом месте. Однако будьте осторожны с использованием памяти с помощью множества изображений. –

+0

Спасибо, Брэд. Я проверю это. Благодарю. – geforce

+0

Это помогло мне получить более высокие частоты кадров, но из-за UIView 1024x600px, я надеюсь, что есть еще несколько способов улучшить его. Как насчет CALayers? Любые другие идеи, как получить больше FPS? – geforce

ответ

0

Per комментарий Брэда:

Вы, вероятно, не следует загружать свои десять изображений в -drawRect :. Сначала загрузите и кешируйте их где-то в другом месте. Однако будьте осторожны с использованием памяти с помощью множества изображений.

Я закончил с подхода Брэда.

Смежные вопросы