[英]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.