2011-12-27 2 views
3

Что я делаю на каждом событии касания Я создаю изображение из unsigned char *. Вот моя функцияОптимизация производительности Quartz2D при событиях касания

-(void)paint:(ImageWarper::WarpedImage *)warpedImg isCircleRequired:(bool)doDrawCircle atPoint:(CGPoint)pt{ 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
if(!mWarper) 
    return; 
unsigned char *pixelData = warpedImg->Image.Data; 
int imageHeight = warpedImg->Image.Height; 
int scanWidth = warpedImg->Image.ScanWidth; 
int imageWidth = warpedImg->Image.Width; 
CGDataProviderRef provider = CGDataProviderCreateWithData(
                  NULL, 
                  pixelData, 
                  imageHeight * scanWidth, 
                  (CGDataProviderReleaseDataCallback)&freeRawData); 
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB(); 
CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault; 
CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault; 
int bytesPerPixel = warpedImg->Image.Bpp; 
CGImageRef imageRef = CGImageCreate(imageWidth, 
            imageHeight, 
            BitsPerComponent, 
            bytesPerPixel * BitsPerComponent, 
            scanWidth, 
            colorSpaceRef, 
            bitmapInfo, 
            provider, 
            NULL, 
            YES, 
            renderingIntent); 
if(!imageRef) 
    return; 

UIImage *uiImage = [UIImage imageWithCGImage:imageRef]; 
imgScrollView.imgView.image = uiImage; 
UIGraphicsBeginImageContext(mbmpImage.size); 
CGContextRef ctx = UIGraphicsGetCurrentContext(); 
CGContextSetLineWidth(ctx, 1.5); 
CGContextSetStrokeColorWithColor(ctx, [UIColor whiteColor].CGColor); 

[mbmpImage drawInRect:CGRectMake(0, 0, mbmpImage.size.width, mbmpImage.size.height)]; 

[uiImage drawInRect:CGRectMake(warpedImg->Position.X, warpedImg->Position.Y, warpedImg->Image.Width, warpedImg->Image.Height)];   

if(doDrawCircle){ 
    [mbmpImage release]; 
    mbmpImage = [UIGraphicsGetImageFromCurrentImageContext() retain];  

    CGContextStrokeEllipseInRect(ctx,CGRectMake(pt.x - mRadius, pt.y - mRadius, mRadius*2, mRadius*2)); 
} 
else{ 
    [mbmpImage release]; 
    mbmpImage = [UIGraphicsGetImageFromCurrentImageContext() retain]; 
} 
UIImage * resultingImage = [UIGraphicsGetImageFromCurrentImageContext() retain];  

UIGraphicsEndImageContext(); 
imgScrollView.imgView.image = resultingImage ; 

if(!doDrawCircle) { 
    [mbmpImage release]; 
    mbmpImage = [resultingImage retain]; 

} 
if(doDrawCircle){ 
    CGPoint pt2 = [self.view convertPoint:pt fromView:imgScrollView]; 
    imgPreview.hidden = NO; 
    [self addText:mbmpImage text: @"+" atPoint:pt atRect:(warpedImg->Position.X, warpedImg->Position.Y, warpedImg->Image.Width, warpedImg->Image.Height)]; 
} 
else{ 
    [popoverController dismissPopoverAnimated:YES]; 
} 
[resultingImage release]; 
CGColorSpaceRelease(colorSpaceRef); 
CGDataProviderRelease(provider); 
CGImageRelease(imageRef); 

[pool drain]; 
} 

Эта функция вызывается следующим образом:

NSMutableDictionary *d = [[NSMutableDictionary alloc] initWithObjectsAndKeys:[NSValue valueWithPointer:wp1],@"warper", @"YES",@"isCircleRequired", 
            [NSValue valueWithCGPoint:location],@"point",nil]; 
[self performSelector:@selector(paintDic:) withObject:d]; 
[d release]; 
wp1 = nil; 

-(void)paintDic:(NSMutableDictionary *)dictionary{ 
ImageWarper::WarpedImage *wp1 = (ImageWarper::WarpedImage *)[[dictionary objectForKey:@"warper"] pointerValue]; 
[self paint:wp1 
    isCircleRequired:[dictionary objectForKey:@"isCircleRequired"] 
    atPoint:[[dictionary objectForKey:@"point"] CGPointValue]]; 
} 

Я использую следующую функцию обратного вызова для освобождения данных.

void freeRawData(void *info, const void *data, size_t size) { 
data = nil; 
} 

Может ли кто-нибудь помочь мне, как мне оптимизировать скорость этого. Он отлично работает на новых iphone, но не старше iphones.

Я вызываю краску в селекторе, чтобы я не выполнял выполнение, пока он завершает создание изображений. Также будет оценена любая помощь в создании изображений непосредственно из необработанных данных, т. Е. Неподписанных символов char *.

ответ

1

Прежде чем вы попытаетесь сделать какие-либо оптимизации, измерьте, где вы проводите время. Инструменты инструментов производительности помогут вам здесь.

Off верхней части моей головы, я вижу немного вещей, которые на самом деле не нужно быть там в коде вы показали:

  • в первую очередь: если вы можете уйти с рисунком менее часто, то сделай это.
  • Вероятность того, что цветовое пространство вашего устройства изменится в течение всего жизненного цикла вашего приложения, можно пренебречь - кеширование цветового пространства в переменной static может сэкономить время от этого кода.
  • Вы уже делаете рисунок уровня CG - не создавая UIImage s, но используя CGContextDrawImage, вместо этого вы можете сэкономить и некоторое время.
  • Если вам не нужна поддержка iOS 3, используйте dispatch_async вместо performSelector:withObject: - таким образом вам не нужно обертывать и разворачивать не-объекты.

Но, как я сказал:

Измерьте свое приложение перед выполнением каких-либо оптимизаций!

Включая эти меры, я также уменьшил количество циклов запуска, которые этот код был выполнен. Эта мера значительно улучшила производительность моего приложения.

+0

Привет, цветовое пространство, сделал некоторую разницу, но не очень большую разницу. Я сталкиваюсь с проблемой, только если размер изображения большой после масштабирования. Является ли эта проблема производительности пропорциональной размеру изображения? – DivineDesert