Çizim yollarıyla oynuyordum ve en azından bazı durumlarda UIBezierPath'in Core Graphics eşdeğeri olacağını düşündüğümden daha iyi performans gösterdiğini fark ettim. Aşağıdaki -drawRect:
yöntem iki yol oluşturur: bir UIBezierPath ve bir CGPath. Yollar, konumları dışında aynıdır, ancak CGPath'i okşamak, UIBezierPath'i okşamaktan kabaca iki kat daha uzun sürer.
- (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];
}
Her iki yol da CGContextStrokePath () kullanıyor, bu yüzden her bir yol tarafından kullanılan zamanı görebilmem için her yolu konturlamak için ayrı yöntemler yarattım. Aşağıda tipik sonuçlar verilmiştir (çağrı ağacı ters çevrilmiştir); -strokeContext:
9,5 saniye sürdüğünü görebilirsiniz .-strokeUIBezierPath:
sadece 5 sn sürer .:
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:]
Görünüşe göre UIBezierPath oluşturduğu yolu bir şekilde optimize ediyor veya CGPath'i saf bir şekilde oluşturuyorum. CGPath çizimimi hızlandırmak için ne yapabilirim?