提高CALayer过滤器的性能

时间:2011-01-21 03:32:19

标签: cocoa performance core-animation calayer core-image

我正在开发一个Cocoa全屏应用程序。我正在使用1 NSView,其中包含1个CALayer,其中包含多个子图层。现在进行测试 - 我正在使用任何击键来向屏幕添加点(20 x 20)。这仅用于测试绘制点。我的问题是我在点图层上使用过滤器 - 特别是我使用CIDiscBlur - 一旦我达到大约30点 - 点的绘制明显减慢。按键和点的外观之间可能有1到1.5秒的延迟。我注意到如果我删除了在图层上设置CIDisBlur过滤器 - 那就没有减速。

在绘制这么多子图层时,我应该使用哪些最佳做法或技巧?任何帮助都会很棒。

    CIFilter *blurFilter = [CIFilter filterWithName:@"CIDiscBlur"];
    [blurFilter setDefaults];
    [blurFilter setValue:(id)[NSNumber numberWithFloat:15.0] forKey:@"inputRadius"];

    dotFilters = [[NSArray arrayWithObjects:(id)blurFilter, nil] retain];

    CGColorRef purpleColor = CGColorCreateGenericRGB(0.604, 0.247, 0.463, 1.0);

    CALayer *dot = [[CALayer layer] retain];
    dot.backgroundColor = purpleColor;
    dot.cornerRadius = 15.0f;
    dot.filters = dotFilters;

    NSRect screenRect = [[self.window screen] frame];

    //  10 point border around the screen

    CGFloat width = screenRect.size.width - 20;
    CGFloat height = screenRect.size.height - 20;

    #define ARC4RANDOM_MAX      0x100000000
    width = ((CGFloat)arc4random() / ARC4RANDOM_MAX) * width + 10;
    height = ((CGFloat)arc4random() / ARC4RANDOM_MAX) * height + 10;

    dot.frame = CGRectMake(width, height, 20,20);//30, 30);


    [dot addSublayer:dotsLayer];

我也尝试使用masksToBounds = YES看看是否有帮助 - 但没有运气。

1 个答案:

答案 0 :(得分:1)

通过不使用圆角半径来制作圆形图层,可能会获得性能提升。虽然在静态上下文中创建圆形图层是一个很好的小捷径,但是当您进行动画处理时,它会显着降低性能。你最好指定一个到CAShapeLayer的圆形路径,或者下拉到Core Graphics,然后在drawInContext调用中画一个圆圈。要测试我是否正确,只需注释您的呼叫以设置角半径并应用您的过滤器。看看是否加快了速度。如果没有,那么我不确定是什么。这可能意味着你必须找到一种不同的方法来获得没有过滤器的效果。如果你总是看到相同的点,你可能会使用图像“作弊”。

最好的问候。