Optimizar el performance de Quartz2D en events táctiles.

Lo que estoy haciendo es en cada evento táctil. Estoy creando una image de char * sin firmar. Esta es mi funcion

-(void)paint:(ImageWarper::WarpedImage *)warpedImg isCircleRequinetworking:(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]; } 

Esta function se llama de la siguiente manera:

 NSMutableDictionary *d = [[NSMutableDictionary alloc] initWithObjectsAndKeys:[NSValue valueWithPointer:wp1],@"warper", @"YES",@"isCircleRequinetworking", [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 isCircleRequinetworking:[dictionary objectForKey:@"isCircleRequinetworking"] atPoint:[[dictionary objectForKey:@"point"] CGPointValue]]; } 

Estoy usando la function de callback siguiente para liberar datos.

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

¿Puede alguien ayudarme cómo optimizo la velocidad de esto? Está funcionando bien en iPhone nuevos, pero no en iPhones más antiguos.

Estoy llamando a paint en el selector de ejecución para que no obtenga ejecución mientras completa su creación de imágenes. También se apreciará cualquier ayuda para crear imágenes directamente a partir de datos sin formatting, es decir, caracteres * no firmados.

Antes de intentar cualquier optimization, mida donde gasta su time. Las herramientas de performance de los instrumentos lo ayudarán aquí.

Por encima de mi cabeza, veo un poco de cosas que realmente no necesitan estar allí en el código que mostraste:

  • Primero y principal: si puede salirse con la suya con less frecuencia, entonces hágalo.
  • La probabilidad de que el espacio de color de su dispositivo cambie durante el time de vida de su aplicación puede ignorarse: el almacenamiento en caching del espacio de color en una variable static podría ahorrar time fuera de este código.
  • Ya estás haciendo un dibujo a nivel CG: no crea UIImage s, pero usar CGContextDrawImage podría ahorrarle bastante time.
  • Si no necesita admitir iOS 3, use dispatch_async lugar de performSelector:withObject: esta forma no necesita envolver y desenvolver sus types de object.

Pero como dije:

¡Mida su aplicación antes de realizar cualquier optimization!

Incluyendo estas medidas, también networkinguje el número de ciclos de ejecución que se ejecutó este código. Esta medida mejoró drásticamente el performance de mi aplicación.