Кэширование в CGLayer медленнее, чем перерисовка на iPhone

Я нахожусь в процессе создания простой программы для рисования для iPhone. В настоящий момент сенсорные события добавляют свое местоположение в список, который связан с кучей вызовов CGContextAddLineToPoint, которые перерисовываются при каждом вызове drawRect.

У меня проблемы с производительностью при довольно небольшом количестве строк (хотя они прозрачные), поэтому я попытался нарисовать все в CGLayer. Теперь вместо того, чтобы рисовать каждую линию в каждом кадре, он рисует каждую линию только один раз и рисует CGLayer на экране каждый кадр.

        CGContextRef backgroundContext = CGLayerGetContext(pathBuffer);
        CGContextSetLineWidth(backgroundContext, 2.0);
        CGContextSetLineCap(backgroundContext, kCGLineCapButt);
        CGContextSetStrokeColorWithColor(backgroundContext, [pathColor CGColor]);

        if([[touchPoints objectAtIndex:0] continuesToNextPoint])
        {
            CGContextMoveToPoint(backgroundContext, [[touchPoints objectAtIndex:0] point].x, [[touchPoints objectAtIndex:0] point].y);
            CGContextAddLineToPoint(backgroundContext, [[touchPoints objectAtIndex:1] point].x, [[touchPoints objectAtIndex:1] point].y);
            CGContextStrokePath(backgroundContext);
        }

        //remove it from touchpoints
        [touchPoints removeObjectAtIndex:0];
    }

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextDrawLayerAtPoint(context, CGPointMake(0, 0), pathBuffer);

Это, во всяком случае, МЕДЛЕННО, чем то, что я делал раньше. Я делаю что-то неправильно? Будет ли мне лучше рисовать на UIImage или что-то? Благодарю.

1 ответ

Решение

Что вы должны делать, это вставить CALayer в одном из ваших представлений, обновляя слой, а затем вызывая setNeedsDisplayInRect: с границами области, которая изменилась на слое, что вызывает его обновление. Если вы попытаетесь обновить весь экран, это будет медленно.

Используете ли вы инструменты, чтобы выяснить, какие части медленные? Я рекомендую использовать его, чтобы узнать, какие части замедляют вас.

Другие вопросы по тегам