当我调整包含大约10,000 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而不是每个&#34; cell&#34;,因为单个CATextLayer只能有一种前景色和一种背景色。
答案 0 :(得分:1)
您可以尝试按如下方式解决此问题:
缺点是正在进行的调整大小看起来有点像素化。此外,将10K图层渲染到位图上可能非常耗时。
优点是渲染完成后,调整大小既快又顺畅。