2013-03-13 8 views
4

У меня следующий код ниже. Это в основном один фрагмент 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); 
} 

ответ

1

Рисование графики на iPad 3 Отображение сетчатки происходит медленнее, чем рисование на iPad 2 без сетчатки.

Я помню, что Apple изначально заявляла, что iPad 3 «на 4 раза быстрее, чем iPad 2». Кажется, это не так. Если бы это было тогда рендеринг Retina (что на 4 раза больше пикселей) на экране должно быть как минимум такая же скорость, что и не сетчатка iPad 2.

Такая же проблема произошла, когда Apple выпустила iPhone 4. iPhone 4 на самом деле медленнее, чем 3GS и 3G.

CoreGraphics slower on iPhone4 than on 3G/3GS

Для увеличения кадров в секунду, необходимо уменьшить количество пикселей DrawRect необходимо обратить. Я предлагаю рисовать связанные с CoreGraphics вещи с половинным разрешением. Затем возьмите этот контекст как растровое изображение и увеличьте его до полного разрешения. Но только пока пользователь перетаскивает.

+0

Мысль такая ... Это огромный позор. Есть ли что-то, что я делаю неправильно, что вы можете видеть? Или что-нибудь, что я мог сделать, чтобы сделать вещи быстрее? –

Смежные вопросы