如何在永久性画布上绘制并将其绘制在视图中?

| 我正在为iOS编写一个小型绘画应用程序。我在UIView广告的drawRect:方法中将其子类化。直到我开始有很多对象(实际上是折线),然后性能开始下降,一切都很好。
- (void)drawRect:(CGRect)rect {
    [super drawRect:rect];

    CGContextRef imageContext = UIGraphicsGetCurrentContext();

    int i, j;
    for(i = 0; i < [_strokes count]; i++) {
        NSMutableArray *stroke = [_strokes objectAtIndex:i];
        if([stroke count] < 2) {
            continue;
        }
        CGContextSetStrokeColorWithColor(imageContext, [[_penColours objectAtIndex:i] CGColor]);
        for(j = 0; j < [stroke count]-1; j++) {
            CGPoint line[] = {
                [[stroke objectAtIndex:j] CGPointValue],
                [[stroke objectAtIndex:j+1] CGPointValue]
            };

            CGContextSetLineWidth(imageContext, _brushSize);
            CGContextSetLineCap(imageContext, kCGLineCapRound);
            CGContextSetLineJoin(imageContext, kCGLineJoinRound);

            CGContextAddLines(imageContext, line, 2);
            CGContextStrokePath(imageContext);
        }
    }

    CGContextFlush(imageContext);
}
_strokes是点数组的数组。我的第一个想法是将图像制作为一个ivar,在上下文上绘画,将其他笔画绘制到上下文(将
j = 0
更改为
j = [stroke count] - 2
),然后将上下文获取为图像,然后将其存储回ivar。没用 然后,我尝试了许多其他值得一提的道路,直到我发现了SO的另一个问题(Quartz2D性能-如何提高)。不幸的是,它没有按我预期的那样工作,因为我必须保留图像,导致内存警告1、2崩溃。
- (void)drawRect:(CGRect)rect {
    [super drawRect:rect];

    UIGraphicsBeginImageContext(CGSizeMake(1024, 768));
    CGContextRef imageContext = UIGraphicsGetCurrentContext();

    if(_image != nil) {
        CGContextDrawImage(imageContext, CGRectMake(0, 0, 1024, 768), [_image CGImage]);
    }

    int i, j;
    for(i = 0; i < [_strokes count]; i++) {
        NSMutableArray *stroke = [_strokes objectAtIndex:i];
        if([stroke count] < 2) {
            continue;
        }
        CGContextSetStrokeColorWithColor(imageContext, [[_penColours objectAtIndex:i] CGColor]);
        for(j = [stroke count]-2; j < [stroke count]-1; j++) {
            CGPoint line[] = {
                [[stroke objectAtIndex:j] CGPointValue],
                [[stroke objectAtIndex:j+1] CGPointValue]
            };

            CGContextSetLineWidth(imageContext, _brushSize);
            CGContextSetLineCap(imageContext, kCGLineCapRound);
            CGContextSetLineJoin(imageContext, kCGLineJoinRound);

            CGContextAddLines(imageContext, line, 2);
            CGContextStrokePath(imageContext);
        }
    }

    _image = UIGraphicsGetImageFromCurrentImageContext();
    [_image retain];
    UIGraphicsEndImageContext();

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextDrawImage(context, CGRectMake(0, 0, 1024, 768), [_image CGImage]);
}
    
已邀请:
        看起来至少部分问题是您保留了_image但从未释放它。每次为_image分配一个新值时,您就在泄漏前一个图像,这将很快填满内存。 除此之外,您可能应该为屏幕外绘图使用CGLayer而不是位图。您可以随时绘制到图层中,然后将其复制到-drawRect:方法的屏幕上。     

要回复问题请先登录注册