4

我在下面有以下代码,它基本上是PieChart的一个切片,其中包含许多切片。每个切片都是以自己的方式绘制的,CALayer并使用addSublayer:.

问题是我在用户拖动手指时动态更新饼图(他们可以通过拖动来编辑饼图值)。它运行良好,但在重新绘制这些饼图“切片”时存在非常明显的滞后。我查看了 iOS 分析工具,它显示 > 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);
}
4

1 回答 1

1

在 iPad 3 Retina 显示屏上绘制图形比在 iPad 2 非 Retina 显示屏上绘制要慢。

我记得苹果最初声称 iPad 3 是“比 iPad 2 快 4 倍的图形”。情况似乎并非如此。如果将 Retina(像素多 4 倍)渲染到屏幕上,其速度至少应与非 Retina iPad 2 相同。

苹果发布 iPhone 4 时也发生了同样的问题。iPhone 4 实际上比 3GS 和 3G 都慢。

iPhone4 上的 CoreGraphics 比 3G/3GS 上的慢

要增加 fps,您需要减少 drawRect 需要绘制的像素数。我建议将与 CoreGraphics 相关的内容绘制为半分辨率上下文。然后将该上下文作为位图并将其放大到全分辨率。但仅在用户拖动时。

于 2013-03-13T16:13:23.723 回答