假设您必须在一个大小可能为3,000×3,000的UIView上画出100,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解决方案。
发布于 2011-04-08 22:32:22
这篇博客文章我的Matt也许会让你感兴趣。他说的是QuartzGL和“常规”绘图(所以不是你想要的),但我认为您可能处于某种类似的情况下。基本上,它归结为“这不重要”/“你不能说”。
最后,我想您应该尝试实现这两个选项,看看哪个更好。
https://stackoverflow.com/questions/5600302
复制相似问题