2011-04-08 38 views
2

因此,假设您必须将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解决方案。

+0

OpenGL可以像您正在寻找的一样快。但是,如果你不习惯它,学习曲线可能会非常陡峭。 – 2011-04-08 21:15:41

+0

如果速度更快,我可能不得不走上这条路。如果您有任何示例代码链接可以密切关注我的请求(即,绘制openGL原语并将其作为UIImage发送到UIView),我们将不胜感激。否则,看起来我有相当多的阅读要做。 – 2011-04-08 21:52:08

+0

我拥有的代码来自OpenGL ES应用程序的项目模板。这实际上只是对那里的东西进行了积极的扩张。 (理解我可以删除的内容花了不少时间)。我刚刚创建了一个新的代码,我修改的代码位于创建的TestProjectViewController的drawFrame方法中(我的Project是名称TestProject)。你特别说过你想保存缓冲区并将其发送到UIImageView。在上下文中渲染图层有几种功能,您可以为这些图层提供GL图层上下文。 – 2011-04-10 02:35:08

回答

0

This blog post我的马特加拉格尔可能会对你感兴趣。虽然他说的是QuartzGL与“常规”绘图(所以不是刚好是),但我认为你可能会有些类似的情况。基本上,它归结为“没关系”/“你不能说”。

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