Я работаю над приложением iOS, которое визуализирует данные как линейный график. Граф рисуется как CGPath
в полноэкранном пользовательском UIView
и содержит не более 320 точек данных. Данные часто обновляются, и график необходимо перерисовывать соответственно - частота обновления 10/сек будет приятной.
До сих пор так легко. Кажется, однако, что мой подход занимает много процессорного времени. Обновление графика с 320 сегментами в 10 раз в секунду приводит к 45% загрузки процессора для процесса на iPhone 4S.
Возможно, я недооцениваю графическую работу под капотом, но для меня очень много нагрузки на процессор.
Ниже приведена моя функция 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 иметь смысл/разницу?
Спасибо/Andi
Обновление: Я также попытался использовать UIBezierPath
вместо CGPath
. Этот пост здесь дает приятное объяснение, почему это не помогло. Тонкая настройка CGContextSetMiterLimit
et al. также не принесло большого облегчения.
Обновление # 2: В итоге я переключился на OpenGL. Это была крутая и разочаровывающая кривая обучения, но повышение производительности просто невероятно. Однако алгоритмы сглаживания CoreGraphics выполняют более приятную работу, чем то, что может быть достигнуто с помощью 4x-мультисэмплинга в OpenGL.