Производительность при частом рисовании CGPaths

Я работаю над приложением для iOS, которое визуализирует данные в виде линейного графика. График нарисован какCGPath в полноэкранном режимеUIView и содержит не более 320 точек данных. Данные часто обновляются, и график должен быть соответствующим образом перерисован - частота обновления 10 / сек была бы хорошей.

Пока все просто. Кажется, однако, что мой подход занимает много процессорного времени. Обновление графика с 320 сегментами со скоростью 10 раз в секунду приводит к 45% загрузке ЦП для процесса на iPhone 4S.

Может быть, я недооцениваю работу графики под капотом, но мне кажется, что загрузка CPU для этой задачи очень важна.

Ниже мойdrawRect() функция, которая вызывается каждый раз, когда новый набор данных готов.N содержит количество очков иpoints этоCGPoint* вектор с координатами для рисования.

- (void)drawRect:(CGRect)rect {

    CGContextRef context = UIGraphicsGetCurrentContext();

    // set attributes
    CGContextSetStrokeColorWithColor(context, [UIColor lightGrayColor].CGColor);
    CGContextSetLineWidth(context, 1.f);

    // create path
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathAddLines(path, NULL, points, N+1);

    // stroke path
    CGContextAddPath(context, path);
    CGContextStrokePath(context);

    // clean up
    CGPathRelease(path); 
}

Я попытался отрисовать путь к автономному CGContext, прежде чем добавить его к текущему слою, как было предложено.Вот, но без какого-либо положительного результата. Я также возился с рисованием подхода к CALayer напрямую, но это тоже не имело никакого значения.

Любые предложения, как улучшить производительность для этой задачи? Или рендеринг просто больше работы для процессора, который я понимаю? Будет ли OpenGL иметь смысл / разницу?

Спасибо / Энди

Обновить: Я также пытался использоватьUIBezierPath вместоCGPath, Эта почтаВот дает хорошее объяснение, почему это не помогло. доводкаCGContextSetMiterLimit и другие. также не принесло большого облегчения.

Обновление № 2: В конце концов я перешел на OpenGL. Это была крутая и разочаровывающая кривая обучения, но повышение производительности просто невероятно. Однако алгоритмы сглаживания в CoreGraphics работают лучше, чем то, чего можно достичь с помощью 4x-мультисэмплинга в OpenGL.

Ответы на вопрос(5)

Ваш ответ на вопрос