因此,假设您必须将100,000行绘制到尺寸可能为3,000 x 3,000的UIView上。顺便说一下,它位于UIScrollView的内部。我用Quartz-2D做了这种常规的方式,编写了一个常规的drawRect,它需要很长的时间(最新硬件需要几分钟)。我做了一些研究,似乎有2种更快的方法:iPhone - 绘制大量静态线(Quartz2D vs OpenGL ES性能)
1)使用石英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解决方案。
OpenGL可以像您正在寻找的一样快。但是,如果你不习惯它,学习曲线可能会非常陡峭。 – 2011-04-08 21:15:41
如果速度更快,我可能不得不走上这条路。如果您有任何示例代码链接可以密切关注我的请求(即,绘制openGL原语并将其作为UIImage发送到UIView),我们将不胜感激。否则,看起来我有相当多的阅读要做。 – 2011-04-08 21:52:08
我拥有的代码来自OpenGL ES应用程序的项目模板。这实际上只是对那里的东西进行了积极的扩张。 (理解我可以删除的内容花了不少时间)。我刚刚创建了一个新的代码,我修改的代码位于创建的TestProjectViewController的drawFrame方法中(我的Project是名称TestProject)。你特别说过你想保存缓冲区并将其发送到UIImageView。在上下文中渲染图层有几种功能,您可以为这些图层提供GL图层上下文。 – 2011-04-10 02:35:08