title: Smoother freehand drawing experience (iOS)
body: <p>I am making a math related activity in which the user can draw with their fingers for scratch work as they try to solve the math question.  However, I notice that when I move my finger quickly, the line lags behind my finger somewhat noticeably.  I was wondering if there was some area I had overlooked for performance or if <code>touchesMoved</code> simply just doesn't come enough (it is perfectly smooth and wonderful if you don't move fast).  I am using <code>UIBezierPath</code>.  First I create it in my init method like this:</p>
  
  <pre><code>myPath=[[UIBezierPath alloc]init];
  myPath.lineCapStyle=kCGLineCapSquare;
  myPath.lineJoinStyle = kCGLineJoinBevel;
  myPath.lineWidth=5;
  myPath.flatness = 0.4;
  </code></pre>
  
  <p>Then in drawRect:</p>
  
  <pre><code>- (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];
  }
  </code></pre>
  
  <p>baseImageView is what I use to save the result so that I don't have to draw many paths (gets really slow after a while).  Here is my touch logic:</p>
  
  <pre><code>-(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];
  }
  </code></pre>
  
  <p>This project is going to be released as an enterprise app, so it will only be installed on iPad 2.  Target iOS is 5.0.  Any suggestions about how I can squeeze a little more speed out of this would be appreciated.</p>