UIBezierPath太多路径=太慢了?

时间:2012-10-12 08:36:51

标签: iphone ios xcode quartz-graphics drawrect

我有一个循环,其中我向UIBezierPath添加了许多(10000+)行。这似乎很好,但是一旦我尝试渲染贝塞尔路径,我的设备变得极其缓慢和生涩。这是因为我在路径上添加了太多行吗?

向UIBezierPath添加行 - 简化:(这看起来很好)

[path moveToPoint:CGPointZero];

   for (int i = 0; i < 10000; i++ ) {      
           [path addLineToPoint:CGPointMake(i, i)];
    }

渲染BeizerPath(Rob建议) - 这似乎很慢。

- (void)drawBezierAnimate:(BOOL)animate
{
    UIBezierPath *bezierPath = path;

    CAShapeLayer *bezier = [[CAShapeLayer alloc] init];

    bezier.path          = bezierPath.CGPath;
    bezier.strokeColor   = [UIColor blueColor].CGColor;
    bezier.fillColor     = [UIColor clearColor].CGColor;
    bezier.lineWidth     = 2.0;
    bezier.strokeStart   = 0.0;
    bezier.strokeEnd     = 1.0;
    [self.layer addSublayer:bezier];

    if (animate)
    {
        CABasicAnimation *animateStrokeEnd = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
        animateStrokeEnd.duration  = 100.0;
        animateStrokeEnd.fromValue = [NSNumber numberWithFloat:0.0f];
        animateStrokeEnd.toValue   = [NSNumber numberWithFloat:1.0f];
        [bezier addAnimation:animateStrokeEnd forKey:@"strokeEndAnimation"];
    }
}

Qs的:

1)这是因为我太快地添加太多路径了吗?

2)我想最终画出许多不同颜色的不同线条,所以我假设我需要创建多个(10000+)UIBezierPaths - 这会对设备有帮助还是大大减慢?

3)我如何解决这个问题?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

我认为没有办法让这个跑得足够快。

它可能适用于一次性渲染(到图像缓冲区)。但是有了动画 - 没有。

文档没有对路径中的点数进行限制,但是有数千个,我认为你已经超过了任何合理的限制。

OpenGL在这里可能很有用 - 也许有人可以加入并就此提出一些建议。

单独使用UIKit,您可能需要从多个缓存层中组合图像。

答案 1 :(得分:2)

我发现由于抗锯齿,UIBezierPath很慢。我的解决方案是在各种拖动操作期间关闭抗锯齿,并在完成手势重绘后启用抗锯齿功能。

您可以使用CGContextSetShouldAntialias(context,...);

执行此操作