我有一个循环,在这个循环中,我向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"];
}
}Qs:
1)这是因为我添加的路径太多太快了吗?
2)我想最终绘制许多不同颜色的不同线条,所以我假设我需要创建多个(10000+) UIBezierPaths -这是否也会帮助或大大降低设备的运行速度?
3)我该如何解决这个问题?
提前感谢您的帮助。
发布于 2012-10-12 17:34:47
我不认为有一种方法可以让它运行得足够快。
它可能适用于一次性渲染(到图像缓冲区)。但要有动画效果-不。
文档没有对路径中的点数进行限制,但是有成千上万的点数,我认为你已经超出了任何合理的限制。
OpenGL在这里可能很有用-也许有人可以插话并给出一些建议。
单独使用UIKit时,您可能必须从多个缓存层合成图像。
发布于 2013-09-13 10:57:31
我发现由于抗锯齿,UIBezierPath速度很慢。我的解决方案是在各种拖动操作期间关闭抗锯齿,并在手势完成后重新绘制并启用抗锯齿功能。
您可以使用CGContextSetShouldAntialias(context,...)来完成此操作;
https://stackoverflow.com/questions/12855212
复制相似问题