iPhone - рисование множества статических линий (производительность Quartz2D и OpenGL ES) - PullRequest
2 голосов
/ 09 апреля 2011

Итак, предположим, вам пришлось нарисовать 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 дальше.

1 Ответ

0 голосов
/ 09 апреля 2011

Это сообщение в блоге мой Мэтт Галлахер может вас заинтересовать.Он говорит о QuartzGL против «обычного» рисования, хотя (поэтому не точно того, что вам нужно), но я думаю, что вы можете оказаться в несколько похожей ситуации.По сути, это сводится к тому, что «это не имеет значения» / «вы не можете сказать».

В конце, я думаю, вам следует попробовать реализовать оба варианта и посмотреть, какой из них работает лучше.

...