CGLayer и CGPath с антиалиасингом

Я рисую несколько CGPaths в представлении Какао в методе drawRect на iPad. Я начал рисовать их прямо в контексте UIGraphicsGetCurrentContext(), но производительность упала, когда мои пути стали очень длинными. На основании нескольких других вопросов я начал изучать использование CGLayers .

Итак, что я делаю сейчас, так это визуализирую путь внутри CGContextRef, который я получаю от вызова CGLayerGetContext. Вот основная схема того, что я делаю:

// rect comes from the drawRect: method
layer = CGLayerCreateWithContext(context, rect.size, NULL);
layerContext = CGLayerGetContext(layer);
CGContextSetLineCap(layerContext, kCGLineCapRound);

// Set the line styles
CGContextSetLineJoin(layerContext, kCGLineJoinRound);
CGContextSetLineWidth(layerContext, 1.0);
CGContextSetStrokeColorWithColor(layerContext, [UIColor blackColor].CGColor);

// Create a mutable path
path = CGPathCreateMutable();

// Move to start point
//...

for (int i = 0; i < points.count; i++) {
    // compute controlPoint and anchorPoint
    //...

    CGPathAddQuadCurveToPoint(path,
                              nil,
                              controlPoint.x,
                              controlPoint.y,
                              anchorPoint.x,
                              anchorPoint.y);
}
// Stroke the path
CGContextAddPath(layerContext, path);
CGContextStrokePath(layerContext);

// Add the layer to the main context
CGContextDrawLayerAtPoint(context, CGPointZero, layer);

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

CGContextSetShouldAntialias(layerContext, YES);
CGContextSetAllowsAntialiasing(layerContext, YES);
CGContextSetInterpolationQuality(layerContext, kCGInterpolationHigh);

к приведенному выше коду безрезультатно. Я даже установил свойства сглаживания на главном context без изменений. Я сделал снимки экрана с теми же результатами кода, но со вторым изображением, созданным из рисунка в CGLayer. Как видите, он действительно неровный, несмотря на то, что это тот же код, просто отрисовка в layerContext. Как сделать линии на CGLayer плавными?

плавные линиинеровные линии


person Streeter    schedule 06.08.2011    source источник


Ответы (1)


Я обнаружил, что причина того, что второе изображение не сглаживается, заключается в том, что сглаживание не было против. Фон был пуст, поэтому сглаживание не работало. Если вы сделаете большой прямоугольник за пределами полностью прозрачного вида, линия будет рисоваться со сглаживанием. Однако производительность убита. Лучше не идти по этому пути.

person Streeter    schedule 16.08.2011
comment
Привет, @Streeter, я тоже застрял с проблемой CgLayer и не могу понять, как рисовать в CgLayer, я разместил вопрос по этому поводу, не могли бы вы взглянуть на stackoverflow.com/questions/11341763/ - person Ranjit; 05.07.2012