我有一个循环,其中我向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)我如何解决这个问题?
提前感谢您的帮助。
答案 0 :(得分:2)
我认为没有办法让这个跑得足够快。
它可能适用于一次性渲染(到图像缓冲区)。但是有了动画 - 没有。
文档没有对路径中的点数进行限制,但是有数千个,我认为你已经超过了任何合理的限制。
OpenGL在这里可能很有用 - 也许有人可以加入并就此提出一些建议。
单独使用UIKit,您可能需要从多个缓存层中组合图像。
答案 1 :(得分:2)
我发现由于抗锯齿,UIBezierPath很慢。我的解决方案是在各种拖动操作期间关闭抗锯齿,并在完成手势重绘后启用抗锯齿功能。
您可以使用CGContextSetShouldAntialias(context,...);
执行此操作