繁体   English   中英

iPhone-绘制大量静态线条(Quartz2D与OpenGL ES性能)

[英]iPhone - drawing a lot of static lines (Quartz2D vs OpenGL ES performance)

因此,假设您必须在大小为3,000 x 3,000的UIView上绘制100,000条线。 顺便说一下,它位于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];
}

有什么想法吗? 任何帮助和/或建议,不胜感激。


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

我的马特·加拉格尔(Matt Gallagher)的这篇博文可能会让您感兴趣。 他虽然在谈论QuartzGL与“常规”绘图(并非完全是您想要的),但我认为您可能处于类似的情况。 基本上,它可以归结为“没关系” /“你不能说”。

最后,我想您应该尝试同时实现这两个选项,然后看看哪个性能更好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM