我正在制作一个与数学相关的事件,用户可以在其中尝试解决数学问题时用手指绘制草图。但是,我注意到当我快速移动手指时,线条明显滞后于我的手指。我想知道是否有一些地方我忽略了性能,或者 touchesMoved 只是不够(如果你不快速移动,它会非常流畅和美妙)。我正在使用 UIBezierPath 。首先,我在我的 init 方法中创建它,如下所示:
myPath=[[UIBezierPath alloc]init];
myPath.lineCapStyle=kCGLineCapSquare;
myPath.lineJoinStyle = kCGLineJoinBevel;
myPath.lineWidth=5;
myPath.flatness = 0.4;
然后在drawRect中:
- (void)drawRectCGRect)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)touchesBeganNSSet *)touches withEventUIEvent *)event
{
UITouch *mytouch=[[touches allObjects] objectAtIndex:0];
[myPath moveToPoint:[mytouch locationInView:self]];
}
-(void)touchesMovedNSSet *)touches withEventUIEvent *)event
{
UITouch *mytouch=[[touches allObjects] objectAtIndex:0];
[myPath addLineToPoint:[mytouch locationInView:self]];
[self setNeedsDisplay];
}
-(void)touchesEndedNSSet *)touches withEventUIEvent *)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。任何有关如何提高速度的建议都将不胜感激。
Best Answer-推荐答案 strong>
当然,您应该首先在 Instruments 下运行它并寻找您的热点。然后您需要进行更改并重新评估以查看其影响。否则你只是在猜测。也就是说,一些经验笔记:
- 向路径中添加大量元素会变得非常昂贵。如果您的
addLineToPoint: 原来是热点,我不会感到惊讶。这是给我的。
- 我可能会渲染成 CGLayer,而不是使用 UIImageView 来支持您的系统。 CGLayer 已针对渲染到特定上下文进行了优化。
- 为什么要累积路径而不是在每一步都将其渲染到图层中?这样,您的路径将永远不会超过两个元素(move、addLine)。通常使用两阶段方法,以便您可以处理撤消等操作。
- 确保您关闭了所有不需要的 UIBezierPath 功能。特别是,请查看文档中的“访问绘图属性”部分。您可以考虑切换到 CGMutablePath 而不是 UIBezierPath。当配置相同时,它实际上并没有更快,但它的默认设置会关闭更多的东西,所以默认情况下它会更快。 (您已经设置了其中的大部分;您需要在 Instruments 中进行一些实验,看看它们会产生什么影响。)
关于ios - 更流畅的手绘体验(iOS),我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/10797037/
|