因此,假設您必須將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