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

iOS 绘画优化

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

您好,我目前正在开发一个包含通过绘图记笔记的应用程序。我遵循了 ray wenderlich 教程,就我所知,我最终得到了以下代码:

- (void)touchesBeganNSSet *)touches withEventUIEvent *)event {

    mouseSwiped = NO;
    UITouch *touch = [touches anyObject];
    lastPoint = [touch locationInView:self];
} 

- (void)touchesMovedNSSet *)touches withEventUIEvent *)event {
    CGFloat red,green,blue,alpha;

    mouseSwiped = YES;
    UITouch *touch = [touches anyObject];
    CGPoint currentPoint = [touch locationInView:self];



    UIGraphicsBeginImageContext(self.mainImage.frame.size);
    [self.tempDrawImage.image drawInRect:CGRectMake(0, 0, self.mainImage.frame.size.width, self.mainImage.frame.size.height)];

    CGContextSetBlendMode(UIGraphicsGetCurrentContext(),[self getBlendMode]);

    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x , lastPoint.y  );
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x , currentPoint.y  );
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), [self getBrushSize] );

    [[self getPaintColor] getRed:&red green:&green blue:&blue alpha:&alpha];
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), red, green, blue, 1);

    CGContextSetBlendMode(UIGraphicsGetCurrentContext(),[self getBlendMode]);

    CGContextStrokePath(UIGraphicsGetCurrentContext());
    self.tempDrawImage.image = UIGraphicsGetImageFromCurrentImageContext();
    [self.tempDrawImage setAlpha:[self getPaintAlpha]];
    UIGraphicsEndImageContext();

    lastPoint = currentPoint;
}

- (void)touchesEndedNSSet *)touches withEventUIEvent *)event {
    CGFloat red,green,blue;

    if(!mouseSwiped) {

        UIGraphicsBeginImageContext(self.mainImage.frame.size);
        [self.tempDrawImage.image drawInRect:CGRectMake(0, 0, self.mainImage.frame.size.width, self.mainImage.frame.size.height)];
        CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
        CGContextSetLineWidth(UIGraphicsGetCurrentContext(), [self getBrushSize]);

        [[self getPaintColor] getRed:&red green:&green blue:&blue alpha:nil];
        CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), red, green, blue, [self getPaintAlpha]);
        CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y - self.mainImage.frame.origin.y);
        CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y - self.mainImage.frame.origin.y );
        CGContextStrokePath(UIGraphicsGetCurrentContext());
        CGContextFlush(UIGraphicsGetCurrentContext());
        self.tempDrawImage.image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    }

    UIGraphicsBeginImageContext(self.mainImage.frame.size);

    [self.mainImage.image drawInRect:CGRectMake(0, 0, self.mainImage.frame.size.width, self.mainImage.frame.size.height) blendMode:[self getBlendMode] alpha:1.0];
    [self.tempDrawImage.image drawInRect:CGRectMake(0, 0, self.mainImage.frame.size.width, self.mainImage.frame.size.height) blendMode:[self getBlendMode] alpha:[self getPaintAlpha]];
    if(self.drawMode != DrawEraser)
    {
        self.mainImage.image = UIGraphicsGetImageFromCurrentImageContext();
        self.tempDrawImage.image = nil;
    }
    UIGraphicsEndImageContext();
    mouseSwiped = NO;
}

这段代码在一个小框架上工作得很好,但是当我将框架增加到比以前大 2 倍时,不幸的是性能不是很好。所以我在考虑优化代码。我特别关注 touchesMoved 方法。据我了解,它在上下文中绘制整个图像并对其进行一些更改并将上下文分配给图像。绘制整个图像似乎重载。所以我想知道,是否可以将图像的某些部分绘制到上下文中并进行一些更改,然后将上下文的这一部分绘制到图像中。



Best Answer-推荐答案


你是对的 - 每次在 touchesMoved 中重绘整个图像是个坏主意。我认为您应该在开始时创建并保留对上下文的引用。在移动的触摸中,您应该利用它并从上下文中创建图像。您可以使用 CGBitmapContextCreate() 来创建上下文而不是 UIGraphicsBeginImageContext()CGBitmapContextCreateImage() 来从上下文创建图像而不是 UIGraphicsGetImageFromCurrentImageContext()。这是有关如何使用它们的文档( https://developer.apple.com/library/mac/#documentation/graphicsimaging/reference/CGBitmapContext/Reference/reference.html )。

关于iOS 绘画优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17723696/

回复

使用道具 举报

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

本版积分规则

关注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