objective-c - 拥有许多小的 CATextLayer 会导致调整窗口大小的速度变慢

标签 objective-c performance cocoa optimization core-animation

当我调整包含大约 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 图层渲染到位图上可能非常耗时。

优点是渲染完成后,调整大小既快速又平滑。

关于objective-c - 拥有许多小的 CATextLayer 会导致调整窗口大小的速度变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23393853/

相关文章:

css - CSS 特异性如何影响网站性能和页面加载时间

objective-c - NSImageView 图像未在运行的应用程序中显示(但在界面生成器的 xib 中正确显示)

objective-c - 对 Cocoa 应用程序和 Quartz Composer 中的 Movie Loader 补丁之间的绑定(bind)问题感到非常困惑

ios - 使用addObserverForName时保留循环:object:queue:usingBlock:

objective-c - iOS 中的 OpenCV 函数错误

iphone - 使用 NSPredicate 匹配两个数组中的 id

java - 为什么 Java String.indexOf() 优于用户定义类中实现的相同逻辑?

multithreading - 多线程 DBMS?

cocoa - Swift 3 加载 xib。 NSBundle.mainBundle().loadNibNamed 返回 Bool

ios - UILabel中的阴影