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