我创建了一个简单的绘图项目,代码工作正常,但是我想将绘图缓存到CGlayer中,因为我读到它在绘图中更有效。我已经阅读了文档,但无法正确理解。因此,朋友们,请您在这方面帮助我。

下面是我的代码,我想知道如何在其中使用CgLayer

- (void)drawRect:(CGRect)rect
{

   CGContextRef context = UIGraphicsGetCurrentContext();

   if(myLayerRef == nil)
   {

       myLayerRef = CGLayerCreateWithContext(context, self.bounds.size, NULL);
   }

    CGContextRef layerContext = CGLayerGetContext(myLayerRef);

    CGContextDrawLayerAtPoint(context, CGPointZero, myLayerRef);
}


- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{

    UITouch *mytouch=[[touches allObjects] objectAtIndex:0];

    m_previousPoint2 = m_previousPoint1;
    m_previousPoint1 = [mytouch previousLocationInView:self];
    m_currentPoint = [mytouch locationInView:self];

    CGPoint mid1    = midPoint(m_previousPoint1, m_previousPoint2);
    CGPoint mid2    = midPoint(m_currentPoint, m_previousPoint1);

    testpath = CGPathCreateMutable();
    CGPathMoveToPoint(testpath, NULL, mid1.x, mid1.y);

    CGPathAddQuadCurveToPoint(testpath, NULL, m_previousPoint1.x, m_previousPoint1.y, mid2.x, mid2.y);


    CGContextRef context = UIGraphicsGetCurrentContext();

    context = CGLayerGetContext(myLayerRef);

    CGRect bounds = CGPathGetBoundingBox(testpath);

     CGPathRelease(testpath);


    CGRect drawBox = bounds;

    //Pad our values so the bounding box respects our line width
    drawBox.origin.x        -= self.lineWidth * 2;
    drawBox.origin.y        -= self.lineWidth * 2;
    drawBox.size.width      += self.lineWidth * 4;
    drawBox.size.height     += self.lineWidth * 4;


   [self setNeedsDisplayInRect:drawBox];
}


- (void) drawingOperations
{

    CGContextRef context1 = CGLayerGetContext(myLayerRef);



    CGPoint mid1 = midPoint(m_previousPoint1, m_previousPoint2);
    CGPoint mid2 = midPoint(m_currentPoint, m_previousPoint1);



    CGContextMoveToPoint(context1, mid1.x, mid1.y);
    CGContextAddQuadCurveToPoint(context1, m_previousPoint1.x, m_previousPoint1.y, mid2.x, mid2.y);
    CGContextSetLineCap(context1, kCGLineCapRound);
    CGContextSetLineWidth(context1, self.lineWidth);
    CGContextSetStrokeColorWithColor(context1, self.lineColor.CGColor);

    CGContextSetFlatness(context1, 2.0);

    CGContextSetAllowsAntialiasing(context1, true);


    CGContextStrokePath(context1);
}


问候
兰吉特

最佳答案

@hfossli发布的链接现在已失效,但是这里是存档内容:

不再推荐CGLayer

robnapier发表于2012年7月13日在图书更新中

我在WWDC的实验室中花费了大量时间,询问问题并与开发人员交谈。这次,我与Core Graphics工程师坐下来,向他们询问了我最喜欢的未充分利用的工具之一:CGLayer,我将在第6章的末尾进行讨论。CGLayer听起来是个好主意:专门为在屏幕上绘制而优化的绘制上下文,与硬件优化。可能出什么问题了?

但是,我开始怀疑CGLayer始终是一个伟大的胜利。如果您的图层太大而无法存储在GPU纹理中怎么办?广告CGLayer被用作重复绘制的“印记”。在GPU之间来回移动数据非常昂贵。除非您多次绘制,否则CGLayer可能没有任何意义。该文档对此没有提供指导。

所以我问核心图形团队“我什么时候应该使用CGLayer?”

“决不。”

……?决不?但是要冲压吗?

决不。

所以我们聊了更多。看上去CGLayer是听起来很不错的东西之一,但实际上并非总是如此。有时会更快。有时会慢一些。没有什么简单的规则可以加快速度。随着时间的流逝,他们似乎已经悄悄放弃了它,却没有实际弃用它。我已要求对文档进行更新以符合Apple当前的建议。自2006年以来,《 CGLayer参考》一直没有更新。

我收到的建议是使用CGBitmapContext或CALayer进行标记。对于第131-132页上给出的特定示例,CATextLayer可能是最好的工具。请记住,您可以使用initWithLayer:轻松克隆CALayer。 (约翰·穆勒(John Mueller)在下面指出,这实际上不受支持。)

关于ios - 如何使用CgLayer进行最佳绘图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11341763/

10-12 14:59