Нарисуйте контур пути с градиентом - PullRequest
3 голосов
/ 09 декабря 2010

Я пытаюсь нарисовать штрих кривой Безье с линейным градиентом, переходящим от красного к зеленому.На данный момент я делаю:

NSBezierPath* path = [NSBezierPath bezierPath];
[path setLineWidth: 1];

NSPoint startPoint = {  10, 100 };
NSPoint endPoint   = { 590, 500 };

int r1 = arc4random() % 1000;
int r2 = arc4random() % 1000;
NSPoint cp1 = { 700, -500 + r1 };
NSPoint cp2 = { -500 + r2, 700 };

[path  moveToPoint: startPoint];
[path curveToPoint: endPoint
     controlPoint1: cp1
     controlPoint2: cp2];

if (curves.count == 50) {
    [curves removeObjectAtIndex:0];
}
[curves addObject:path];

int i = 0;
for (NSBezierPath * p in curves) {
    [[redColors objectAtIndex:i++] set];
    [p stroke];
}

И это прекрасно работает, но когда я конвертирую NSBezierPath path в CGPathRef myPath = [path quartzPath] и перебираю 'CGPathRef' вместо 'NSBezierPath':

CGPathRef myPath = [path quartzPath];
if (curves.count == size) {
    [paths removeObjectAtIndex:0];
}
[paths addObject:myPath];

CGContextRef c = [[NSGraphicsContext currentContext]graphicsPort];
for (int i = 0; i < paths.count; i++) {
    [self drawPath:c :[paths objectAtIndex:i]:i];
}

Моя производительность падает с 30 FPS до 5 FPS!

Вот мой код для drawPath:

-(void) drawPath:(CGContextRef) c: (CGPathRef) myPath: (int) i {
    CGContextSaveGState(c);
    CGContextAddPath(c, myPath);
    CGContextReplacePathWithStrokedPath(c);
    CGContextClip(c);

    //  Draw a linear gradient from top to bottom
    CGContextDrawLinearGradient(c, cfGradients[i], start, end, 0);

    CGContextRestoreGState(c);
}

redColors и cfGradients - это массивы, хранящие элементы с альфа-каналомот 0-1 / 0-255, поэтому их не нужно создавать заново на каждой итерации.

Эта производительность даже намного хуже, чем в Java.Конечно, должен быть способ рисовать штрих более эффективно без всех этих переходов с NSBezierPath на CGPathRef и т. Д.

Пожалуйста, помогите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...