所以假设你必须在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解决方案。
答案 0 :(得分:0)
This blog post我的马特加拉格尔可能会对你感兴趣。他说的是QuartzGL与“常规”绘图(所以不是完全你所追求的),但我认为你可能处于某种类似的情况。基本上,它归结为“无所谓”/“你无法分辨”。
最后,我猜你应该尝试实现这两个选项,看看哪个选项表现更好。