0

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

问候兰吉特

4

2 回答 2

3

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

不再推荐 CGLayer

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

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

不过,我开始怀疑 CGLayer 总是一个伟大的胜利。如果您的图层太大而无法存储在 GPU 纹理中怎么办?CGLayer 被宣传用作您反复绘制的“印章”。将数据移入和移出 GPU 的成本很高。除非您绘制一定次数,否则可能 CGLayer 没有意义。文档对此没有提供任何指导。

所以我问 Core Graphics 团队“我什么时候应该使用 CGLayer?”</p>

“从来没有。”</p>

……???绝不?但是对于冲压对吗?

绝不。

于是我们又聊了几句。看起来 CGLayer 是那些在纸上听起来很棒的东西之一,但在实践中并不总是有效。有时它会更快。有时它更慢。什么时候会更快,没有简单的规则。随着时间的推移,他们似乎已经悄悄地放弃了它而没有真正弃用它。我已要求更新文档以符合 Apple 当前的建议。CGLayer 参考自 2006 年以来未更新。

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

于 2017-08-05T17:36:44.080 回答
0

不再适合使用 CGLayer

http://iosptl.com/posts/cglayer-no-longer-recommended/

于 2014-08-14T08:34:37.140 回答