大UIBezierPath,慢渲染

时间:2015-02-16 05:43:23

标签: ios cocoa-touch graphics core-graphics uibezierpath

对于我正在创建的应用,我使用UIBezierPath来存储路径。问题是这条路径的长度不断增加,并且在某个时刻,应用程序滞后并变得不稳定。因为路径的长度不断增加,我不断重新绘制视图100次(如果有更好的方法,请告诉我)。在某个时刻,应用程序变得非常生涩。我认为这是因为走这条路需要太长时间。

您可以在我的drawRect方法中看到图片已翻译。屏幕上只有很少的路径,所以有没有办法只划出可见的路径部分?这就是我认为我使用CGContextClip方法所做的事情,但没有明显改善。

- (void)drawRect:(CGRect)rect {
    CGContextRef myContext = UIGraphicsGetCurrentContext();
    CGContextTranslateCTM(myContext, 0, yTranslation);
    [[UIColor whiteColor] setStroke];
    [bPath addLineToPoint:currentPoint];
    [bPath setLineWidth:lineWidth];
    CGContextClip(myContext);
    [bPath stroke];
}

谢谢。

2 个答案:

答案 0 :(得分:1)

缓存是一种可能的解决方案:在具有透明背景的内存映像中绘制一次曲线。仅在曲线更改时更新此图像。在您绘制的任何内容上叠加此缓存图像。处理能力应该更便宜。

另一种可能性是在确定哪些点将影响当前视图后从贝塞尔曲线中移除不需要的点,然后渲染得到的贝塞尔曲线。

答案 1 :(得分:1)

有几点想法:

  1. 恕我直言,你根本不应该定期添加数据点。当且仅当有新数据点要添加时才应添加数据点(例如,使用touchesMoved调用UIGestureStateChanged或手势识别器)。这减少了bezier中的点数,并且延迟了性能问题强加给你的点。这个过程应该由触摸事件驱动,而不是计时器。

  2. 如果您的某些绘图在屏幕外,您可以通过检查其中任何一个点是否属于视图的可见部分(例如CGRectContainsPoint)来加快速度。您应该检查线段与CGRect的交点(因为理论上它既不是起点也不是终点在可见矩形内,但是它们之间的线段与矩形相交) 。

    您还可以设计此过程,以便仅在视口移动时确定哪些段可见。这样可以避免需要不断迭代一个非常大的数组。

  3. 在某些时候,绘制单个路径与位图图像的回报递减,即使只是对于可见部分。有时将旧路径渲染为图像,然后在该快照上绘制新路径而不是每次重绘整个路径都很有用。例如,我已经使用了一种方法,当我开始一个新的手势时,我会拍摄旧图像并仅在其上绘制新手势。