如何使用CgLayer进行最佳绘图

时间:2012-07-05 09:46:08

标签: ios cocoa-touch drawing quartz-graphics cglayer

我创建了一个简单的绘图项目,代码工作正常,但我想将绘图缓存到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);
}

此致 兰吉特

2 个答案:

答案 0 :(得分:2)

@hfossli发布的链接现在已经死了,但这是存档的内容:

CGLayer不再推荐

发布者:robnapier于2012年7月13日在图书更新中

我花了很多时间在WWDC的实验室里提问并与开发人员交谈。这次我坐下了核心图形工程师并向他们询问了我最喜欢的一个未充分利用的工具:CGLayer,我在第6章结尾处讨论过.CGLayer听起来是一个好主意:专为在屏幕上绘图而优化的绘图环境,通过硬件优化。可能出现什么问题?

但是,我开始怀疑CGLayer总是一场伟大的胜利。如果您的图层太大而无法存储在GPU纹理中,该怎么办? CGLayer被广告用作您反复绘制的“图章”。将数据移入GPU和从GPU移动数据非常昂贵。也许CGLayer没有意义,除非你画了一定次数。文档没有给出任何指导。

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

“从不”

...... ???决不?但是为了冲压吧?

从不。

所以我们谈了一些。似乎CGLayer是纸上听起来很棒的东西之一,但并不总是在实践中起作用。有时它更快。有时它慢。当它变得更快时,没有简单的规则。随着时间的推移,似乎他们已经悄然放弃了它而没有实际弃用它。我已经要求更新文档以符合Apple目前的建议。 CGLayer Reference自2006年以来一直没有更新。

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

答案 1 :(得分:0)