Метод DrawRect, замедляющийся со временем. Почему?

Я отправил, это в другом месте соединяет шиной, не могло получить справку.

Так в основном я пытаюсь сделать его так, пользователь может "нарисовать" Изображение на представление. Путем я пытаюсь выполнить, это каждым 9ish пиксель перемещения на экране, я создаю маску проведенной линии и затем отсекаю изображение с той маской.

Это на самом деле работает красиво сначала, и затем приблизительно после 20 секунд рисования как это, это является невыносимо отстающим. Это не дискретный переход. Это непрерывно становится медленнее и медленнее.

Моя мысль, контекст не становится очищенным правильно, таким образом, со временем, drawrect метод должен сделать больше работы для отсечения изображения.

Так или иначе вот код.

- (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;
}

Также мой метод клипа:

- (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;

Спасибо за любую справку!

1
задан Ryan 23 July 2010 в 11:18
поделиться

2 ответа

Вы постоянно добавляете новые UIImages в свое представление с помощью этой строки

[self.view addSubview:dummyIV];

Чем больше представлений вы добавляете, тем медленнее оно становится - он должен отрисовывать каждое изображение каждый раз, когда вы обновляете экран, поэтому через 20 секунд, вероятно, будет довольно много несколько изображений!

2
ответ дан 2 September 2019 в 22:49
поделиться

Похоже, эта строка создает какой-то мусор:

UIImage *dummyImage = [UIImage alloc];
0
ответ дан 2 September 2019 в 22:49
поделиться