2014-04-30 95 views
2

當我調整一個包含大約10,000 CATextLayers的窗口時,初始大小調整將窗口凍結幾秒鐘。初步凍結後,明顯改變口吃大小。有很多小CATextLayers調整窗口的大小緩慢

分析和常識表明,這是緩慢的,因爲所有的內部重繪(顯然CATextLayers使用核心文本下)。

可以做什麼優化(如果有的話)來使用10,000個文本圖層調整窗口大小的快速和高效?

下面是我用它來創建層的代碼,在一個簡單的NSView子類:

- (id) initWithFrame:(NSRect)frameRect { 
    if (self = [super initWithFrame:frameRect]) { 
     [self setLayer:[CALayer layer]]; 
     [self setWantsLayer:YES]; 
    } 
    return self; 
} 

- (void) awakeFromNib { 
    [super awakeFromNib]; 

    int w = 8; 
    int h = 14; 

    self.layer.backgroundColor = [NSColor whiteColor].CGColor; 

    for (int y = 0; y < 100; y++) { 
     for (int x = 0; x < 100; x++) { 
      CATextLayer* t = [CATextLayer layer]; 
      t.opaque = YES; 
      t.frame = NSMakeRect(x * w, y * h, w, h); 
      t.foregroundColor = [NSColor blackColor].CGColor; 
      t.backgroundColor = [NSColor yellowColor].CGColor; 
      t.string = @"a"; 
      t.font = (__bridge CGFontRef)[NSFont fontWithName:@"Menlo" size:12]; 
      t.fontSize = 12; 
      [self.layer addSublayer:t]; 
     } 
    } 
} 

欲瞭解更多背景:我創建一個文本網格,每個單元格的字符,文本顏色和背景顏色可以改變(有點像Terminal.app)。

由於這個原因,我想到的一種優化方式是每行使用一個CATextLayer,而不是每個「單元」,因爲單個CATextLayer只能有一個前景色,一個背景顏色。

+0

調整大小開始時,將10K圖層平鋪爲一個[通過將它們全部渲染到位圖圖層](http://stackoverflow.com/q/2034674/335858)。使用位圖圖層來調整大小。調整大小結束後,請再次替換10K'CATextLayer'。缺點是正在調整大小看起來有些像素化。優點是它非常快速和平穩。 – dasblinkenlight

+0

我沒有發佈這個作爲答案,因爲這是作爲評論開始,並演變成看起來可能是我輸入它的解決方案。無論如何,我發佈了一個答案 - 試試看,我很好奇,看看這是否有幫助,或者它是否簡單地將CPU負載轉移到不同的地方。 – dasblinkenlight

+0

這聽起來像你需要一種方法來減少層數。我可以想出一種方法來製作四層圖片 - (1)在符號的位置上有一個前景顏色正方形的真實圖層,(2)#1的蒙版圖層,整個文本以alpha = 1文本呈現在背景中alpha = 0,(3)在符號位置具有背景顏色正方形的真實層,以及(4)用於#3的掩模層,其中整個文本在背景中以alpha = 0和alpha = 1呈現。這裏是一個[關於面具的鏈接](http://evandavis.me/blog/2013/2/13/getting-creative-with-calayer-masks)。 – dasblinkenlight

回答

1

你可以嘗試如下解決這個問題:

缺點是正在進行的調整大小看起來有些像素化。另外,將10K圖層渲染到位圖上可能會很耗時。

好處是,一旦渲染完成,調整大小是快速和平滑的。

+0

作爲實現這一目標的一步,我嘗試刪除並重新添加實時調整大小的圖層,並隱藏/顯示它們。在使用大約100,000個圖層進行實時大小調整時,兩者仍然明顯較慢。 – sdegutis

+0

@sdegutis 100K層太多了 - 甚至10K聽起來像是邊界線,但100K很多。 – dasblinkenlight

+0

「文件,當我這樣做時會傷害(在視圖中放置10k或100k圖層)」 –