2

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

向 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"];
    }
}

问:

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

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

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

在此先感谢您的帮助。

4

2 回答 2

2

我认为没有办法让这个运行足够快。

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

该文档没有限制路径中的点数,但是我认为有数千个点,您已经超出了任何合理的限制。

OpenGL 在这里可能很有用——也许有人可以插话并就此提供一些建议。

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

于 2012-10-12T09:34:46.933 回答
2

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

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

于 2013-09-13T02:57:31.277 回答