當我調整一個包含大約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只能有一個前景色,一個背景顏色。
調整大小開始時,將10K圖層平鋪爲一個[通過將它們全部渲染到位圖圖層](http://stackoverflow.com/q/2034674/335858)。使用位圖圖層來調整大小。調整大小結束後,請再次替換10K'CATextLayer'。缺點是正在調整大小看起來有些像素化。優點是它非常快速和平穩。 – dasblinkenlight
我沒有發佈這個作爲答案,因爲這是作爲評論開始,並演變成看起來可能是我輸入它的解決方案。無論如何,我發佈了一個答案 - 試試看,我很好奇,看看這是否有幫助,或者它是否簡單地將CPU負載轉移到不同的地方。 – dasblinkenlight
這聽起來像你需要一種方法來減少層數。我可以想出一種方法來製作四層圖片 - (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