缓存到CGLayer比在iPhone上重画慢

缓存到CGLayer比在iPhone上重画慢,iphone,cocoa-touch,performance,cglayer,Iphone,Cocoa Touch,Performance,Cglayer,我正在为iPhone制作一个简单的绘图程序。目前,触摸事件将它们的位置添加到一个列表中,该列表与一组CGContextAddLineToPoint调用相连接,这些调用在每次调用drawRect时都会重新绘制 我在相当少的行数下遇到了性能问题(尽管它们是透明的),所以我尝试将所有内容都绘制到CGLayer中。现在,它不再每帧绘制每一条线,而是只绘制一次每一条线,并在每一帧将CGLayer绘制到屏幕上 CGContextRef backgroundContext = CGLayerG

我正在为iPhone制作一个简单的绘图程序。目前,触摸事件将它们的位置添加到一个列表中,该列表与一组CGContextAddLineToPoint调用相连接,这些调用在每次调用drawRect时都会重新绘制

我在相当少的行数下遇到了性能问题(尽管它们是透明的),所以我尝试将所有内容都绘制到CGLayer中。现在,它不再每帧绘制每一条线,而是只绘制一次每一条线,并在每一帧将CGLayer绘制到屏幕上

        CGContextRef backgroundContext = CGLayerGetContext(pathBuffer);
        CGContextSetLineWidth(backgroundContext, 2.0);
        CGContextSetLineCap(backgroundContext, kCGLineCapButt);
        CGContextSetStrokeColorWithColor(backgroundContext, [pathColor CGColor]);

        if([[touchPoints objectAtIndex:0] continuesToNextPoint])
        {
            CGContextMoveToPoint(backgroundContext, [[touchPoints objectAtIndex:0] point].x, [[touchPoints objectAtIndex:0] point].y);
            CGContextAddLineToPoint(backgroundContext, [[touchPoints objectAtIndex:1] point].x, [[touchPoints objectAtIndex:1] point].y);
            CGContextStrokePath(backgroundContext);
        }

        //remove it from touchpoints
        [touchPoints removeObjectAtIndex:0];
    }

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextDrawLayerAtPoint(context, CGPointMake(0, 0), pathBuffer);

如果有什么区别的话,这比我以前做的要慢。我做错什么了吗?给我画一幅UIImage或其他东西会更好吗?谢谢。

您应该做的是在其中一个视图中插入一个
CALayer
,更新图层,然后使用图层上已更改的区域边界调用
setNeedsDisplayInRect:
,从而使其更新。如果你试图更新整个屏幕,它会很慢


你是不是在用仪器来判断哪些部件是慢的?我建议您使用它来了解哪些部分使您的速度变慢。

您应该做的是在其中一个视图中插入一个
CALayer
,更新图层,然后使用图层上已更改的区域边界调用
setNeedsDisplayInRect:
。如果你试图更新整个屏幕,它会很慢


你是不是在用仪器来判断哪些部件是慢的?我建议您使用它来了解哪些部分会让您慢下来。

看起来有30%的处理时间都花在了CGContextStrokePath上。感谢您对仪器的了解,顺便说一句,如果您不知道,我对这方面还很陌生。谢谢,这就解决了问题。看起来有30%的处理时间都花在了CGContextStrokePath上。顺便说一句,感谢仪器方面的指导——如果你说不出来的话,我对这一点很陌生。谢谢,这就解决了问题。