ฉันกำลังเล่นกับเส้นทางการวาดและฉันสังเกตเห็นว่าอย่างน้อยในบางกรณี UIBezierPath ก็ทำได้ดีกว่าสิ่งที่ฉันคิดว่าจะเทียบเท่ากับ Core Graphics -drawRect:
วิธีการดังต่อไปนี้จะสร้างสองเส้นทางหนึ่ง UIBezierPath และหนึ่ง CGPath เส้นทางจะเหมือนกันยกเว้นตำแหน่งของมัน แต่การลูบ CGPath จะใช้เวลาประมาณสองเท่าเมื่อลาก UIBezierPath
- (void)drawRect:(CGRect)rect
{
CGContextRef ctx = UIGraphicsGetCurrentContext();
// Create the two paths, cgpath and uipath.
CGMutablePathRef cgpath = CGPathCreateMutable();
CGPathMoveToPoint(cgpath, NULL, 0, 100);
UIBezierPath *uipath = [[UIBezierPath alloc] init];
[uipath moveToPoint:CGPointMake(0, 200)];
// Add 200 curve segments to each path.
int iterations = 200;
CGFloat cgBaseline = 100;
CGFloat uiBaseline = 200;
CGFloat xincrement = self.bounds.size.width / iterations;
for (CGFloat x1 = 0, x2 = xincrement;
x2 < self.bounds.size.width;
x1 = x2, x2 += xincrement)
{
CGPathAddCurveToPoint(cgpath, NULL, x1, cgBaseline-50, x2, cgBaseline+50, x2, cgBaseline);
[uipath addCurveToPoint:CGPointMake(x2, uiBaseline)
controlPoint1:CGPointMake(x1, uiBaseline-50)
controlPoint2:CGPointMake(x2, uiBaseline+50)];
}
[[UIColor blackColor] setStroke];
CGContextAddPath(ctx, cgpath);
// Stroke each path.
[self strokeContext:ctx];
[self strokeUIBezierPath:uipath];
[uipath release];
CGPathRelease(cgpath);
}
- (void)strokeContext:(CGContextRef)context
{
CGContextStrokePath(context);
}
- (void)strokeUIBezierPath:(UIBezierPath*)path
{
[path stroke];
}
ทั้งสองเส้นทางใช้ CGContextStrokePath () ดังนั้นฉันจึงสร้างวิธีการแยกกันเพื่อขีดเส้นแต่ละเส้นทางเพื่อที่ฉันจะได้เห็นเวลาที่แต่ละเส้นทางใช้ในเครื่องมือ ด้านล่างนี้คือผลลัพธ์ทั่วไป (เรียกต้นไม้กลับหัว); คุณจะเห็นว่า-strokeContext:
ใช้เวลา 9.5 วินาทีในขณะที่-strokeUIBezierPath:
ใช้เวลาเพียง 5 วินาที:
Running (Self) Symbol Name
14638.0ms 88.2% CGContextStrokePath
9587.0ms 57.8% -[QuartzTestView strokeContext:]
5051.0ms 30.4% -[UIBezierPath stroke]
5051.0ms 30.4% -[QuartzTestView strokeUIBezierPath:]
ดูเหมือนว่า UIBezierPath กำลังเพิ่มประสิทธิภาพเส้นทางที่สร้างขึ้นหรือฉันกำลังสร้าง CGPath ด้วยวิธีที่ไร้เดียงสา ฉันจะทำอย่างไรเพื่อเพิ่มความเร็วในการวาด CGPath ของฉัน