• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - 更流畅的手绘体验(iOS)

[复制链接]
菜鸟教程小白 发表于 2022-12-12 21:12:43 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在制作一个与数学相关的事件,用户可以在其中尝试解决数学问题时用手指绘制草图。但是,我注意到当我快速移动手指时,线条明显滞后于我的手指。我想知道是否有一些地方我忽略了性能,或者 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-推荐答案


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

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

关于ios - 更流畅的手绘体验(iOS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10797037/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap