Итак, предположим, вам пришлось нарисовать 100 000 линий на UIView, который может быть размером 3000 x 3000. Между прочим, он находится внутри UIScrollView. Я сделал это обычным способом с Quartz-2D, написав обычный drawRect, и это занимает слишком много времени (пару минут на новейшем оборудовании). Я провел некоторое исследование, и, кажется, есть 2 более быстрых метода:
1) Используйте Quartz-2D, но рисуйте в буфер за пределами экрана, затем загружайте в UIView
2) Используйте OpenGL ES, рисуйте линии, печатайте в UIImage и загружайте в UIView
Есть ли у вас чувство разницы в производительности между оригиналом и этими двумя методами? У вас есть пример кода, который я мог бы использовать для выполнения (1) или (2)? Это кажется простой задачей, но я немного растерялся.
Для варианта (1), вот моя попытка из того, что я мог найти в Интернете:
- (CGContextRef) createOffscreenContext: (CGSize) size {
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(NULL, size.width, size.height, 8,
size.width*4, colorSpace, kCGImageAlphaPremultipliedLast);
CGColorSpaceRelease(colorSpace);
CGContextTranslateCTM(context, 0, size.height);
CGContextScaleCTM(context, 1.0, -1.0);
return context;
}
- (void)drawRect:(CGRect) rect {
self.backgroundColor = [UIColor clearColor];
CGSize size = self.frame.size;
drawingContext = [self createOffscreenContext: size];
UIGraphicsPushContext(drawingContext);
//draw stuff here
CGImageRef cgImage = CGBitmapContextCreateImage(drawingContext);
UIImage *uiImage = [[UIImage alloc] initWithCGImage:cgImage];
UIGraphicsPopContext();
CGImageRelease(cgImage);
[uiImage drawInRect: rect];
[uiImage release];
}
Мысли? Любая помощь и / или совет приветствуется.
ОБНОВЛЕНИЕ: я реализовал 1-е решение, и оно на самом деле намного быстрее. Однако это делает программу довольно нестабильной, и иногда вызов setNeedsDisplay приводит к сбою. Попробуем поработать над решением OpenGL дальше.