2014-02-20 4 views
0

Я создал приложение для рисования, чтобы рисовать, когда вы касаетесь экрана, и он работает очень плавно в симуляторе, но когда я тестировал его на своем iPad 2, он замедляется, и мне очень долго нужно рисовать. Я использую эти строки кода:Производительность приложения для рисования

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [[event allTouches] anyObject]; 
    lastPoint = [touch locationInView:self.view]; 
} 


- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    mouseSwiped = YES; 

    UITouch *touch = [touches anyObject]; 
    currentPoint = [touch locationInView:self.view]; 



    UIGraphicsBeginImageContext(self.view.frame.size); 
    [drawImage.image drawInRect:self.view.frame]; 

    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); 
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 7.0); 
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0, 1, 0, 1); 
    CGContextBeginPath(UIGraphicsGetCurrentContext()); 
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); 
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y); 
    CGContextStrokePath(UIGraphicsGetCurrentContext()); 


    [drawImage setFrame:self.view.frame]; 
    drawImage.image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    lastPoint = currentPoint; 

    [self.view addSubview:drawImage]; 
} 

Я думаю, что проблема с вызовом drawInRect: метод в touchMoved: метод

+0

Попробуйте проанализировать это с помощью инструмента Time Profiler - он расскажет вам, какие вызовы методов используют большинство времени процесса. Просмотрите видеоролик WWDC «Основная анимация»: https://developer.apple.com/videos/wwdc/2011/index.php – elimirks

+0

Кажется, это отличное приложение для использования displayLink. Вызывайте setNeedsDisplay только столько раз в секунду, сколько бы событий касалось. – Putz1103

+0

Да, я знаю, что ошибка в drawInRect: вызов, потому что когда я удаляю, он работает плавно, но рисунок не идеален в этом случае – user3330895

ответ

1
  1. Стройте UIBezierPath в вашем touchesMoved и не делать каких-либо рисунок там.
  2. Call setNeedsDisplay in touchesMoved.
  3. Переопределите drawRect и проведите свой путь туда.

ИЛИ

Используйте установить подкладочный слой для вашего зрения на CAShapeLayer и добавить точки к слою в touchesMoved.

+0

Можете ли вы объяснить это мне по коду – user3330895

+0

Я не понимаю, что вы имеете в виду? – user3330895

+0

+1 Это правильный ответ. @ user3330895 Не ожидайте, что кто-нибудь напишет код для вас; вы узнаете гораздо больше, сделав это самостоятельно. Ответ Стивена довольно ясен: если вы этого не понимаете, вы должны: а) прочитать о том, как вы должны сделать вид, и б) спросить конкретно о том, что вы не понимаете. – Caleb

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