Tôi đang thử với các đường vẽ và tôi nhận thấy rằng trong ít nhất một số trường hợp, UIBezierPath hoạt động tốt hơn những gì tôi nghĩ là một Core Graphics tương đương. Các -drawRect:
phương pháp dưới đây sẽ tạo ra hai con đường: một UIBezierPath, và một CGPath. Các đường dẫn giống hệt nhau ngoại trừ vị trí của chúng, nhưng vuốt CGPath mất khoảng gấp đôi thời gian vuốt 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];
}
Cả hai đường dẫn đều sử dụng CGContextStrokePath (), vì vậy tôi đã tạo các phương thức riêng biệt để vuốt từng đường dẫn để tôi có thể xem thời gian được sử dụng bởi từng đường dẫn trong Instruments. Dưới đây là các kết quả điển hình (gọi ngược cây); bạn có thể thấy -strokeContext:
mất 9,5 giây, trong khi -strokeUIBezierPath:
chỉ mất 5 giây.:
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:]
Có vẻ như UIBezierPath bằng cách nào đó đang tối ưu hóa đường dẫn mà nó tạo ra hoặc tôi đang tạo CGPath một cách ngây thơ. Tôi có thể làm gì để tăng tốc bản vẽ CGPath của mình?