У меня следующий код ниже. Это в основном один фрагмент PieChart со многими из этих фрагментов. Каждый срез нарисован в собственном CALayer
и добавлен в пользовательский вид, используя addSublayer:
.Как улучшить скорость CGContextDrawPath/drawInContext:
Проблема в том, что я динамически обновляю круговую диаграмму, когда пользователь тащит палец (они могут редактировать значения круговой диаграммы путем перетаскивания). Он работает хорошо, но есть очень заметное отставание при повторном рисовании этих «кусочков» пирога. Я смотрю на инструмент профилирования iOS, и это показывает, что> 50% времени находится в CGContextDrawPath()
, так как он должен перерисовывать кусочек пирога каждый раз, когда пользователь перемещает определенное количество градусов.
Мой вопрос: что я могу сделать, чтобы улучшить скорость этого кода? Есть что-то, что мне не хватает?
Также, как примечание, этот код хорошо работает на iPad 2 (допустимые уровни кадров в секунду), но на 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);
}
Мысль такая ... Это огромный позор. Есть ли что-то, что я делаю неправильно, что вы можете видеть? Или что-нибудь, что я мог сделать, чтобы сделать вещи быстрее? –