[英]How to improve speed of CGContextDrawPath / drawInContext:
我在下面有下面的代码,它基本上是PieChart的一个切片,其中包含许多切片。 每个切片都在其自己的CALayer
绘制,并使用addSublayer:
添加到自定义视图层addSublayer:
。
问题是我正在动态更新饼图,因为用户拖动他们的手指(他们可以通过拖动来编辑饼图值)。 它运作良好,但重新绘制这些馅饼'切片'时会有明显的延迟。 我看一下iOS Profiling工具,它显示> 50%的时间在CGContextDrawPath()
因为每次用户移动一定数量的度数时它必须重绘饼图切片。
我的问题是,我该怎么做才能提高这段代码的速度? 有什么我想念的吗?
另外作为旁注,这个代码在iPad 2(可接受的fps级别)上运行良好,但在iPad 3上它运行得很糟糕,从我的估计它慢了2倍。 有谁能解释一下? 它只是视网膜显示器吗?
-(void)drawInContext:(CGContextRef)ctx {
// Create the path
CGRect insetBounds = CGRectInset(self.bounds, self.strokeWidth, self.strokeWidth);
CGPoint center = CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2);
CGFloat radius = MIN(insetBounds.size.width/2, insetBounds.size.height/2);
CGContextBeginPath(ctx);
CGContextMoveToPoint(ctx, center.x, center.y);
CGPoint p1 = CGPointMake(center.x + radius * cosf(self.startAngle), center.y + radius * sinf(self.startAngle));
CGContextAddLineToPoint(ctx, p1.x, p1.y);
int clockwise = self.startAngle > self.endAngle;
CGContextAddArc(ctx, center.x, center.y, radius, self.startAngle, self.endAngle, clockwise);
CGContextClosePath(ctx);
// Color it
CGContextSetFillColorWithColor(ctx, self.fillColor.CGColor);
CGContextSetStrokeColorWithColor(ctx, self.strokeColor.CGColor);
CGContextSetLineWidth(ctx, self.strokeWidth);
CGContextDrawPath(ctx, kCGPathFillStroke);
}
将图形绘制到iPad 3 Retina显示屏比绘制到iPad 2非Retina更慢。
我记得Apple最初声称iPad 3“比iPad 2快了4倍”。 似乎并非如此。 如果它然后渲染Retina(它是4倍像素)到屏幕应该至少与非视网膜iPad 2相同的速度。
Apple发布iPhone 4时也出现了同样的问题.iPhone 4实际上比3GS和3G都要慢。
iPhone4上的CoreGraphics比3G / 3GS慢
要增加fps,您需要减少drawRect需要绘制的像素数。 我建议将你的CoreGraphics相关内容绘制为半分辨率上下文。 然后将该上下文作为位图并将其扩展到完整分辨率。 但只有在用户拖动时。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.