拥有许多小型CATextLayers会使窗口调整速度变慢

时间:2014-04-30 16:53:05

标签: objective-c performance cocoa optimization core-animation

当我调整包含大约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只能有一种前景色和一种背景色。

1 个答案:

答案 0 :(得分:1)

您可以尝试按如下方式解决此问题:

缺点是正在进行的调整大小看起来有点像素化。此外,将10K图层渲染到位图上可能非常耗时。

优点是渲染完成后,调整大小既快又顺畅。