当我调整包含大约 10,000 个 CATextLayers 的窗口大小时,初始调整大小会使窗口卡住几秒钟。初始卡住后,调整大小会明显卡顿。
分析和常识表明,由于所有内部重绘,这很慢(显然 CATextLayers 在幕后使用 Core Text)。
可以进行哪些优化(如果有)来快速高效地调整具有 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 层压平为一个 by rendering them all to a bitmap layer .
- 使用位图图层调整大小。
- 调整大小结束后,再次替换为 10K CATextLayers。
缺点是正在进行的大小调整看起来有些像素化。此外,将 10K 图层渲染到位图上可能非常耗时。
优点是渲染完成后,调整大小既快速又平滑。
关于objective-c - 拥有许多小的 CATextLayer 会导致调整窗口大小的速度变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23393853/