iPhone - 绘制了很多静态线条(Quartz2D vs OpenGL ES性能)

时间:2011-04-08 20:13:00

标签: iphone opengl-es quartz-graphics quartz-2d

所以假设你必须在UIView上绘制100,000行,其大小可能是3,000 x 3,000。顺便说一句,它位于UIScrollView内部。我使用Quartz-2D以常规方式执行此操作,编写常规drawRect,并且需要太长时间(在最新硬件上花费几分钟)。我做了一些研究,似乎有两种更快的方法:

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];
}

思考?任何帮助和/或建议表示赞赏。


更新:我实施了第一个解决方案,实际上更快了。但是它会使程序非常不稳定,有时调用setNeedsDisplay会使程序崩溃。接下来将尝试使用OpenGL解决方案。

1 个答案:

答案 0 :(得分:0)

This blog post我的马特加拉格尔可能会对你感兴趣。他说的是QuartzGL与“常规”绘图(所以不是完全你所追求的),但我认为你可能处于某种类似的情况。基本上,它归结为“无所谓”/“你无法分辨”。

最后,我猜你应该尝试实现这两个选项,看看哪个选项表现更好。