繁体   English   中英

如何提高CGContextDrawPath / drawInContext的速度:

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM