Ios 大的UIBezierPath,渲染速度慢

Ios 大的UIBezierPath,渲染速度慢,ios,cocoa-touch,graphics,core-graphics,uibezierpath,Ios,Cocoa Touch,Graphics,Core Graphics,Uibezierpath,对于我正在创建的应用程序,我使用UIBezierPath来存储路径。问题是,这条路径的长度不断增加,在某一点上,应用程序会滞后并变得不稳定。因为路径的长度不断增加,所以我每秒不断地重画视图100次(如果有更好的方法,请告诉我)。在某一点上,应用程序会变得非常不稳定。我认为这是因为划过这条路太长了 您可以在mydrawRect方法中看到图形被转换。屏幕上显示的路径很少,因此是否有办法只划过路径可见的部分?这就是我用CGContextClip方法所做的,但没有明显的改进 - (void)drawRe

对于我正在创建的应用程序,我使用
UIBezierPath
来存储路径。问题是,这条路径的长度不断增加,在某一点上,应用程序会滞后并变得不稳定。因为路径的长度不断增加,所以我每秒不断地重画视图100次(如果有更好的方法,请告诉我)。在某一点上,应用程序会变得非常不稳定。我认为这是因为划过这条路太长了

您可以在my
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];
}

谢谢。

缓存是一种可能的解决方案:在内存中具有透明背景的图像上绘制一次曲线。仅当曲线更改时更新此图像。将此缓存图像覆盖到正在绘制的任何对象上。它的处理能力应该更便宜

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

一些想法:

  • 嗯,你根本不应该以固定的间隔添加数据点。当且仅当存在要添加的新数据点时(例如,
    touchesMoved
    或使用
    UIGestureStateChanged调用手势识别器),才应添加数据点。这减少了bezier中的点数,并延迟了性能问题强加给您的时间点。该过程应由触摸事件驱动,而不是计时器

  • 如果某些图形不在屏幕上,您可能可以通过检查任一点是否位于视图的可见部分(例如
    CGRectContainsPoint
    )来加快速度。您可能应该检查线段与
    CGRect
    的交点(因为理论上,起点和终点都不可能位于可见矩形内,但它们之间的线段可能与矩形相交)

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

  • 在某些情况下,与位图图像相比,绘制单个路径的回报会越来越小,即使是对于可见部分也是如此。有时,将旧路径渲染为图像,然后在该快照上绘制新路径,而不是每次都重新绘制整个路径是很有用的。例如,我使用了这样一种方法,当我开始一个新的手势时,我会抓拍旧的图像,然后只在上面画新的手势


  • 是的,但是曲线在不断变化。这仍然有用吗?我想我不太明白。我的图形知识是有限的它每秒改变100次吗?是的,但我可以改变,有没有办法只画路径的可见部分?你是说曲线的长度每秒增加100次,而你是每秒重画100次?在这种情况下,您需要确定哪些控制曲线路径的点对当前视图没有影响,并在绘制之前先将其删除。@Rob是的,该线与用户的点击有关。我有一个计时方法,每10毫秒调用一次,以刷新屏幕并根据用户最后一次点击进行调整。但无论如何,这条路从来都不是一成不变的。另外,我只是添加点,整个曲线没有变化。谢谢。@Rob应用程序的性质要求添加这些数据点。我确实将更新从10毫秒更改为40毫秒,并且有了显著的改进。然而,我的理想方案是缩短屏幕上可见的路径。