2011-04-08 36 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與「常規」繪圖(所以不是剛好是),但我認爲你可能會有些類似的情況。基本上,它歸結爲「沒關係」/「你不能說」。

最後,我想你應該嘗試實現這兩個選項,並看看哪一個更好。