Saya bermain-main dengan jalur menggambar, dan saya perhatikan bahwa setidaknya dalam beberapa kasus, UIBezierPath mengungguli apa yang saya pikir akan setara dengan Grafik Inti. The -drawRect:
metode di bawah ini menciptakan dua jalur: satu UIBezierPath, dan satu CGPath. Jalurnya identik kecuali lokasinya, tetapi membelai CGPath membutuhkan waktu kira-kira dua kali lebih lama daripada membelai 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];
}
Kedua jalur menggunakan CGContextStrokePath (), jadi saya membuat metode terpisah untuk menggores setiap jalur sehingga saya dapat melihat waktu yang digunakan oleh setiap jalur di Instrumen. Di bawah ini adalah hasil tipikal (pohon panggilan terbalik); Anda dapat melihat bahwa -strokeContext:
membutuhkan 9,5 detik, sedangkan -strokeUIBezierPath:
hanya membutuhkan 5 detik .:
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:]
Sepertinya UIBezierPath entah bagaimana mengoptimalkan jalur yang dibuatnya, atau saya membuat CGPath dengan cara yang naif. Apa yang dapat saya lakukan untuk mempercepat gambar CGPath saya?