UIBezierPath низкая производительность, если используется вместе с CGContextSetShadowWithColor - PullRequest
1 голос
/ 09 января 2012

Я разрабатываю приложение, в котором пользователь рисует линии касанием пальца или просто распыляет цвета.Я использую UIBezierPath для рисования пути (цвета) при касании пальцем в методе drawRect с использованием следующего кода.

CGContextRef context = UIGraphicsGetCurrentContext ();

for (BezierPath *path in paths)
{
    path.path.lineWidth = [DataController dataController].apertureRadius * 2;
    path.path.lineJoinStyle = kCGLineJoinRound;
    path.path.lineCapStyle = kCGLineCapRound;
    ///
    [path.color set];
    CGContextSetShadowWithColor(context, CGSizeMake(0, 0), 20, [path.color CGColor]);//Problem
    //

    [path.path stroke];
}

Этот код отлично работает на симуляторе, ноНа устройстве спрей действительно очень медленный.и проблема только в вызове метода CGContextSetShadowWithColor, если я прокомментирую эту производительность строки лучше всего без проблем.

Пожалуйста, предложите мне, почему это так и что я должен делать.Эта линия необходима, поскольку я хочу показать эффект распыления с размытыми тенями.

1 Ответ

1 голос
/ 30 января 2012

Рисование тени может быть медленным. Система должна нарисовать ваш путь к внеэкранному буферу, вычислить гауссово размытие альфа-канала внеэкранного буфера до другого внеэкранного буфера, затем объединить два внеэкранных буфера в исходный графический контекст.

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

Сохраните свой собственный растровый контекст (созданный с помощью CGBitmapContextCreate или UIGraphicsBeginImageContextWithOptions). Нарисуйте в этом частном контексте. Когда вы получаете событие с перемещением касания, рисуйте только штрих от старого местоположения касания до нового местоположения. Затем получите изображение из растрового контекста (используя CGBitmapContextCreateImage или UIGraphicsGetImageFromCurrentImageContext) и установите его в качестве изображения вашего представления или содержимого вашего слоя.

...