2010-07-23 3 views
1

J'ai posté ceci ailleurs, car le bus n'a pas pu obtenir d'aide.La méthode DrawRect ralentit avec le temps. Pourquoi?

Donc, fondamentalement, j'essaie de faire en sorte que l'utilisateur puisse "dessiner" une image sur une vue. La façon dont j'essaye d'accomplir ceci est par chaque pixel de 9ish de mouvement sur l'écran, je crée un masque de la ligne tracée et puis clip l'image avec ce masque. En fait, il fonctionne magnifiquement au début, et après environ 20 secondes de dessin comme celui-ci, il est insupportablement laggy. Ce n'est pas un saut discret. Il devient de plus en plus lent et lent. Ma pensée est que le contexte ne s'efface pas correctement, donc avec le temps, la méthode drawrect doit faire plus de travail pour découper l'image.

De toute façon, voici le code.

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
UITouch *touch = [touches anyObject]; 
CGPoint currentPoint = [touch locationInView:self.view]; 
currentPoint.y -= 20; 

CGRect dummyRect = CGRectMake(0,0,self.view.frame.size.width, self.view.frame.size.height); 
UIGraphicsBeginImageContext(self.view.frame.size); 
CGContextRef context = UIGraphicsGetCurrentContext(); 
[realImage.image drawInRect:dummyRect]; 
CGContextSetLineCap(context, kCGLineCapRound); 
CGContextSetLineWidth(context, 20.0); 
CGContextSetRGBStrokeColor(context, 1.0, 1.0, 1.0, 1.0); 
CGContextBeginPath(context); 
CGContextMoveToPoint(context, lastPoint.x, lastPoint.y); 
CGContextAddLineToPoint(context, currentPoint.x, currentPoint.y); 
CGContextStrokePath(context); 
realImage.image = UIGraphicsGetImageFromCurrentImageContext(); 
CGContextClearRect(context, dummyRect); 
UIGraphicsEndImageContext(); 




if(powf(startingPoint.x-currentPoint.x,2) + powf(startingPoint.y-currentPoint.y,2)>80) { 
    startingPoint = currentPoint; 

    CGRect rect = CGRectMake(0,0,320,480); 
    UIImage *dummyImage = [UIImage alloc]; 
    dummyImage = [self clipImage:[UIImage imageNamed:@"sauce.png"] withMask:realImage.image atRect:rect]; 

    UIImageView *dummyIV = [[UIImageView alloc] initWithImage:dummyImage]; 
    [self.view addSubview:dummyIV]; 
    [dummyIV release]; 

    realImage.image = nil; 
} 

aussi ma méthode clip:

- (UIImage *)clipImage:(UIImage *)imageIn withMask:(UIImage *)maskIn atRect:(CGRect) maskRect { 
CGRect rect = CGRectMake(0, 0, imageIn.size.width, imageIn.size.height); 
CGImageRef msk = maskIn.CGImage; 

UIGraphicsBeginImageContext(imageIn.size); 
CGContextRef ctx = UIGraphicsGetCurrentContext(); 
CGContextClearRect(ctx, rect); 
CGContextClipToMask(ctx, maskRect, msk); 
CGContextTranslateCTM(ctx, 0.0, rect.size.height); 
CGContextScaleCTM(ctx, 1.0, -1.0); 
CGContextDrawImage(ctx, rect, imageIn.CGImage); 
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
CGContextClearRect(ctx, rect); 
UIGraphicsEndImageContext(); 

UIGraphicsBeginImageContext(maskRect.size); 
CGContextRef newctx = UIGraphicsGetCurrentContext(); 
CGRect clippedRect = CGRectMake(0, 0, maskRect.size.width, maskRect.size.height); 
CGContextClipToRect(newctx, clippedRect); 
CGRect drawRect = CGRectMake(maskRect.origin.x*-1, (newImage.size.height - maskRect.origin.y - maskRect.size.height)*-1, newImage.size.width, newImage.size.height); 
CGContextTranslateCTM(newctx, 0.0, 0); 
CGContextScaleCTM(newctx, 1.0, 1.0); 
CGContextDrawImage(newctx, drawRect, newImage.CGImage); 
UIImage *cropped = UIGraphicsGetImageFromCurrentImageContext(); 
CGContextClearRect(newctx, clippedRect); 
UIGraphicsEndImageContext(); 

return cropped; 

Merci pour toute aide!

Répondre

2

Vous êtes constamment l'ajout de nouvelles UIImages à votre vue avec cette ligne

[self.view addSubview:dummyIV]; 

Plus vues que vous ajoutez, plus il devient lent - Il doit dessiner chaque image chaque fois que vous mettez à jour l'écran, donc après 20 secondes, il y a probablement quelques images!

+0

Je pense que cela a du sens. De quelles manières y a-t-il des moyens? – Ryan

+0

Nevermind. J'ai juste fait une imageview et ai redessiné l'image dans cette vue. Vous aviez absolument raison. Merci beaucoup! – Ryan

0

On dirait que cette ligne crée des ordures:

UIImage *dummyImage = [UIImage alloc]; 
+0

J'ai ajouté du code pour libérer cet objet maintenant, mais toujours pas d'améliorations. Merci quand même. D'autres idées? – Ryan

Questions connexes