2011-05-16 105 views
0

我在iOS的工作,並已提出了這個問題。我將收到一組相對較大的數據(一個500x500或更大的C風格數組)。我需要根據這些數據構建基本上是X/Y圖的東西,其中500x500網格中的每個數據點對應於基於其值的顏色。事情是,這會隨着時間的推移而改變,使得一些動畫保持原樣,所以計算必須快速以便在新的數據集進入時進行更改。Quartz2D性能 - 如何提高

所以基本上,對於數組中的每個點,我需要找出它應該映射到哪種顏色,然後找出在網格上繪製的正方形來表示數據。如果我的網是768x768像素,但我有一個500×500的數據集,則每個數據點將代表約1.5x1.5矩形(這是圓​​的,但我希望你的想法)。

我通過創建一個新的視圖類和重寫的drawRect嘗試這個。然而,這與20x20數據集上的任何事情都有可怕的表現相遇。

我已經看到了一些建議,關於寫入圖像緩衝區,但我一直沒能找到這樣做(我很新於iOS)的任何實例。你有什麼建議嗎?或者你能指點我哪些可以幫助的資源?

謝謝您的時間,

達里爾

回答

1

下面是一些代碼,你可以把在將生成並在屏幕外的上下文返回一個UIImage的方法。爲了提高性能,請嘗試想出最小化迭代次數的方法,例如使「像素」變大或僅繪製一部分變化。

UIGraphicsBeginImageContext(size); // Use your own image size here  

CGContextRef context = UIGraphicsGetCurrentContext();  

// push context to make it current 
// (need to do this manually because we are not drawing in a UIView) 
// 
UIGraphicsPushContext(context);        

for (CGFloat x = 0.0; x<size.width; x+=1.0) { 
    for (CGFloat y=0.0; y< size.height; y+=1.0) { 
// Set your color here 
     CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 1.0)); 
     CGContextFillRect(context, CGRectMake(x, y, 1.0, 1.0)); 
    } 
} 


// pop context 
// 
UIGraphicsPopContext();  


// get a UIImage from the image context- enjoy!!! 
// 
UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext(); 
[outputImage retain]; 

// clean up drawing environment 
// 
UIGraphicsEndImageContext(); 
return [outputImage autorelease]; 
+0

這基本上正是他沒有... – Eiko 2011-05-18 23:07:52

+0

沒有,他是在一個UIView子類,這將是比在屏幕外的圖像內容繪製慢得多使用的drawRect。 – 2011-05-18 23:46:30

+0

是什麼讓這個更快?爲什麼畫到屏幕外的環境要便宜得多?我也建議屏幕外渲染,但直接訪問內存,而不是使用25,000次調用石英,我認爲*(未測量)是這裏的性能瓶頸。 – Eiko 2011-05-18 23:55:13

0

如果你想快,你不應該爲每個像素調用明確的繪圖函數。您可以分配內存並使用CGBitmapContextCreate來構建一個包含該內存中數據的映像 - 這基本上是一個字節數組。進行計算並將顏色信息(a-r-g-b)直接寫入該緩衝區。儘管如此,您必須自己完成數學方面的子像素精度(混合)。

我沒有在手邊的例子,但搜索CGBitmapContextCreate應朝你正確的方向。