我正在开发一个将数据可视化为折线图的 iOS 应用程序。CGPath
该图以全屏自定义方式绘制UIView
,最多包含 320 个数据点。数据经常更新,需要相应地重新绘制图表——10/秒的刷新率会很好。
到目前为止很容易。然而,我的方法似乎需要大量的 CPU 时间。以每秒 10 次的速度用 320 段刷新图表会导致 iPhone 4S 上进程的 CPU 负载为 45%。
也许我低估了引擎盖下的图形工作,但对我来说,这项任务的 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 的方法,但这也没什么区别。
有什么建议可以提高这项任务的性能吗?还是我意识到,渲染对 CPU 的工作量更大?OpenGL有什么意义/区别吗?
谢谢/安迪
更新:我也尝试使用UIBezierPath
而不是CGPath
. 这里的这篇文章很好地解释了为什么这没有帮助。调整CGContextSetMiterLimit
等。也没有带来很大的缓解。
更新 #2:我最终切换到了 OpenGL。这是一个陡峭且令人沮丧的学习曲线,但性能提升令人难以置信。然而,CoreGraphics 的抗锯齿算法比 OpenGL 中的 4 倍多重采样做得更好。