2

我正在做一项与数学相关的活动,用户可以在其中尝试解决数学问题时用手指绘制草图。但是,我注意到当我快速移动手指时,线条明显滞后于我的手指。我想知道是否有一些地方我忽略了性能,或者touchesMoved只是不够好(如果你不快速移动,它会非常平滑和美妙)。我正在使用UIBezierPath. 首先,我在我的 init 方法中创建它,如下所示:

myPath=[[UIBezierPath alloc]init];
myPath.lineCapStyle=kCGLineCapSquare;
myPath.lineJoinStyle = kCGLineJoinBevel;
myPath.lineWidth=5;
myPath.flatness = 0.4;

然后在drawRect中:

- (void)drawRect:(CGRect)rect
{
    [brushPattern setStroke];
    if(baseImageView.image)
    {
        CGContextRef c = UIGraphicsGetCurrentContext();
        [baseImageView.layer renderInContext:c];
    }

    CGBlendMode blendMode = self.erase ? kCGBlendModeClear : kCGBlendModeNormal;
    [myPath strokeWithBlendMode:blendMode alpha:1.0];
}

baseImageView 是我用来保存结果的,这样我就不必绘制很多路径(一段时间后变得非常慢)。这是我的触摸逻辑:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{

    UITouch *mytouch=[[touches allObjects] objectAtIndex:0];
    [myPath moveToPoint:[mytouch locationInView:self]];

}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{    
    UITouch *mytouch=[[touches allObjects] objectAtIndex:0];
    [myPath addLineToPoint:[mytouch locationInView:self]];
    [self setNeedsDisplay];
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{    
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, 0.0f);
    CGContextRef c = UIGraphicsGetCurrentContext();
    [self.layer renderInContext:c];

    baseImageView.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    [myPath removeAllPoints];
    [self setNeedsDisplay];
}

该项目将作为企业应用程序发布,因此只能安装在 iPad 2 上。目标 iOS 是 5.0。任何关于我如何能加快速度的建议将不胜感激。

4

2 回答 2

3

当然,您应该首先在 Instruments 下运行它并寻找您的热点。然后您需要进行更改并重新评估以查看其影响。否则你只是在猜测。也就是说,一些经验说明:

  • 向路径添加大量元素会变得非常昂贵。addLineToPoint:如果你原来是一个热点,我不会感到惊讶。它一直是给我的。
  • 与其用 UIImageView 来支持你的系统,我可能会渲染成 CGLayer。CGLayer 针对渲染到特定上下文进行了优化。
  • 为什么要累积路径而不是在每一步都将其渲染到图层中?这样,您的路径将永远不会超过两个元素(move、addLine)。通常使用两阶段方法,因此您可以处理撤消等。
  • 确保您关闭了您不需要的任何 UIBezierPath 功能。特别是,请查看文档中的“访问绘图属性”部分。您可以考虑切换到 CGMutablePath 而不是 UIBezierPath。当配置相同时,它实际上并没有更快,但它的默认设置会关闭更多的东西,所以默认情况下它会更快。(您已经设置了其中的大部分;您需要在 Instruments 中进行一些实验,看看它们会产生什么影响。)
于 2012-05-29T14:07:33.103 回答
1

http://mobile.tutsplus.com/tutorials/iphone/ios-sdk_freehand-drawing/

这个链接准确地展示了如何使曲线更平滑。本教程一步一步地展示它。并简单地告诉我们如何向曲线添加一些中间点(在 touchesMoved 方法中)以使它们更平滑。

于 2012-11-27T13:00:56.603 回答