gpt4 book ai didi

ios - 如何使用 CgLayer 进行最佳绘图

转载 作者:行者123 更新时间:2023-11-28 22:53:22 25 4
gpt4 key购买 nike

我创建了一个简单的绘图项目,代码工作正常,但我想将绘图缓存到 CGlayer 中,因为我读到它更有效的绘图方式。我已通读文件,但无法正确理解。所以 friend 们,我请求你们在这方面帮助我。

下面是我的代码,我想知道如何在这里面使用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);
}

问候兰 git

最佳答案

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

不再推荐CGLayer

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

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

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

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

“从不。”

……???绝不?但是为了冲压对吗?

从不。

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com