2013-05-11 69 views
2

我建立一個攝譜儀想知道我怎麼能提高我UIView基於代碼的性能。我知道我無法從後臺線程更新iPhone/iPad的用戶界面,所以我正在使用GCD進行大部分處理。我遇到的問題是我的界面仍然更新太慢。使用後臺更新接口更快的方式線程

使用下面的代碼,我試圖採取32個堆疊的4x4像素UIView s並更改其背景顏色(請參閱附加圖像上的綠色方塊)。該操作會爲其他用戶界面產生可見的滯後。

有沒有一種方法可以讓我「準備」這些從某種後臺線程的顏色,然後問主線程刷新界面一下子?

enter image description here

//create a color intensity map used to color pixels 
static dispatch_once_t onceToken; 
dispatch_once(&onceToken, ^{ 
    colorMap = [[NSMutableDictionary alloc] initWithCapacity:128]; 

    for(int i = 0; i<128; i ++) 
    { 
     [colorMap setObject:[UIColor colorWithHue:0.2 saturation:1 brightness:i/128.0 alpha:1] forKey:[NSNumber numberWithInt:i]]; 
    } 


}); 

-(void)updateLayoutFromMainThread:(id)sender 
{ 
    for(UIView* tempView in self.markerViews) 
    { 
     tempView.backgroundColor =[colorMap objectForKey:[NSNumber numberWithInt:arc4random()%128]]; 
    } 

} 
//called from background, would do heavy processing and fourier transforms 
-(void)updateLayout 
{ 

    //update the interface from the main thread 
    [self performSelectorOnMainThread:@selector(updateLayoutFromMainThread:) withObject:nil waitUntilDone:NO]; 


} 

我結束了預先計算的256個色的字典,然後問字典基於該圓正試圖顯示該值的顏色。嘗試在飛行中分配顏色是瓶頸。

+6

所以你基準測試您的應用程序,這竟然是瓶頸,對不對? – 2013-05-11 11:23:19

+1

您表示您的視圖已堆疊。你的意思是隻有其中一個是可見的?如果是的話,該解決方案可能會推遲對除了下一個視圖以外的不可見視圖的所有操作(或者如果您的用戶可以通過各個視圖快速切換,那麼接下來的幾個視圖)。 WWDC 2012有一個視頻,涉及構建併發用戶界面。 – Paul 2013-05-11 13:36:53

+0

非常多我有256列每個有32個UIViews(4px乘4px)。通過堆疊我的意思是它們以4個像素爲增量佔用128個像素。每200ms左右我想做快速傅立葉變換,並使用這些視圖對產生的頻率進行顏色編碼(簡單地改變它們的背景顏色)。 – 2013-05-11 15:53:30

回答

1

,是的,幾個百分點。

雖然你不應該在主線程處理的UIView,您可以使用它們之前實例在後臺線程的意見。不知道這是否會幫助你。然而,除了在後臺線程上實例化視圖之外,UIView實際上只是CALayer對象的元數據包裝器,並針對靈活性而非性能進行了優化。

最好的辦法是在背景線程(這是一個較慢的過程,因爲繪圖使用CPU以及GPU)繪製圖層對象或圖像對象,將圖層對象或圖像傳遞到主線程,然後繪製預渲染的圖像視圖的層(更快,因爲一個簡單的調用,以獲得圖形處理器直接位塊傳輸圖像到了UIView的後備存儲)。

看到這樣的回答:

Render to bitmap then blit to screen

代碼:

- (void)drawRect:(CGRect)rect { 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextDrawImage(context, rect, image); 
} 

執行遠遠比如果你要執行其他繪圖操作,如繪製貝塞爾曲線,在相同的方法快。

+0

不認爲這有助於..他正在接近整個事情錯誤IMO – 2013-05-11 15:56:30

+0

用視圖控制器管理CAlayers取代unviews顯着加快了性能,因爲我可以在後臺執行所有處理,然後用預先計算的顏色填充一堆或多個矩形 – 2013-05-15 00:05:57